webForumDet fria alternativet

hämta ut där ålder < 18

Databaser & SQLur Databashanterare & SQL

35 svar · 866 visningar · startad av ConnyFox

Medlem sedan aug. 20011 087 inlägg
Frågan#1

har ett fält i min databas som innehåller person nummer t.ex 840206-xxxx

det jag vill göra är att plocka ut alla där personen är <18 år.
antar det e datediff eller nått man får använda sig utav..

Medlem sedan juni 200032 967 inlägg
#2

För att kunna använda datumfunktioner måste värdet vara av typen datum. Alltså skulle jag lagra födelsedatumet i ett fält av datumtyp.

Vilken funktion man ska använda beror nog lite på vilken databas (och version) man använder.

Medlem sedan aug. 20011 087 inlägg
#3

Använder mysql och det är tyvärr inte möjligt att lagra det i datumfält då 4 sista siffrorna skall vara med.

Borde ju gå o göra om 840206 till 1984-02-06 och sedan jämföra kanske.. hur vet jag inte :D

Medlem sedan juni 200032 967 inlägg
#4

Jag hade lagrat födelsedatum i ett eget fält, och de fyra sista i ett annat fält, om man nu prompt måste ha med dem.

Du kan ju sedan prova att söka lite här i forumet, för det här med ålder och födelsedagar och sådant diskuteras med jämna mellanrum. Sedan kan man ju alltid rekommendera att du kollar upp datumfunktionerna på www.mysql.com. :)

mvh

Medlem sedan aug. 20011 087 inlägg
#5

Mjo det e tyvärr för sent för det nu då det redan är på detta vis.
Så om någon vet hur man kan fixa det så vore jag tacksam.

Medlem sedan mars 20034 471 inlägg
#6

I så fall får du hämta ut värdet som en sträng och sedan plocka ut de två första siffrorna ur den mha substring. Omvandla till heltal, och räkna i ditt applikationsprogram. Alternativet är väl att ändra i tabellen så att det blir som @nders föreslog.

Medlem sedan aug. 20011 087 inlägg
#7

men det borde väll ganska enkelt gå att göra om 840206 till 1984-02-06 eller?

Sen borde det väll bara vara o köra någon datediff eller dateadd eller nått, vet inte vilket man använder.

@nders förslag är inget alternativ

Medlem sedan dec. 1999707 inlägg
#8

Du skulle ju kunna diffa datumen med GETDATE() och kolla om det är efter 1918-01-01. Kanske inte så snyggt men...

declare @birthdate datetime
SET 	@birthdate = 	convert(datetime, SUBSTRING('910822',1,6), 12)	-- 12 = ISO date (yymmdd)

select GETDATE()-@birthdate

IF (GETDATE()-@birthdate >= '1918-01-01')
	PRINT 'Over 18.'
ELSE
	PRINT 'Under 18'
Medlem sedan mars 20034 471 inlägg
#9

Jag TROR inte att det går inom SQL. Alltså måste det fixas i applikationsprogrammet under alla omständigheter.

toha - det är ju ingen datetime??

Medlem sedan dec. 1999707 inlägg
#10

Ah, my bad aasah. :) Var lite lat av mig där. Ska självklart göra 1918 till en datetime innan man jämför.

Medlem sedan dec. 200012 464 inlägg
#11

Du måste lagra födelseåret med 4 siffror om det skall fungera riktigt.

select extract(year from current_date) -
cast(substring(birthDate from 1 for 4) as integer)
- case when 
cast(substring(birthdate from 5 for 2) as integer) >
extract(month from current_date)
or (cast(substring(birthdate from 5 for 2) as integer) =
extract(month from current_date)
and (cast(substring(birthdate from 7 for 2) as integer) >
extract(day from current_date) then 1 else 0 end
from t
Medlem sedan aug. 20011 087 inlägg
#12

ok men som jag redan sagt så är det för sent för att ändra, det är i formatet 840206-xxxx, det kanske är osmidigt men så är det..

måste ju gå på NÅTT viss o slänga till 19 i början och ett par - mitt i o sedan jämföra eller?

Medlem sedan sep. 20026 425 inlägg
#13

Varför är det för sent att ändra på? Mig veterligen går det relativt enkelt att skapa kolumner i en tabell och sedan sätta in rätt data i de kolumnerna. Skapa en kolumn:

alter table din_tabell add fyra_siffror int

Sen kör du LarsG:s SQL-fråga om jag förstått det hela rätt.

Allmän fråga: Om jag har ett värde i kolumnen namn och vill plocka ut de sex första bokstäverna i värdet, skriver jag då så här:

SELECT substring(namn,1,6) FROM mintabell

eller skriver jag

SELECT namn,substring(namn,1,6) FROM mintabell

?

Medlem sedan juni 200032 967 inlägg
#14

martin, ang din allmänna fråga; det beror på om du vill ha ut fältet namn i sin helhet, utöver de första sex bokstäverna.

Medlem sedan sep. 20026 425 inlägg
#15

@nders skrev:

martin, ang din allmänna fråga; det beror på om du vill ha ut fältet namn i sin helhet, utöver de första sex bokstäverna.

Då så. Då hänger jag med. Tack. Over n out! :bire

Medlem sedan aug. 20011 087 inlägg
#16

M_Soderlund : För att sidan och dess databas redan har varit igång i flera månader och det skulle bli en gimla massa jobb att ändra databasuppbyggnaden och scripten i efterhand.. Dessutom skulle den gamla informationen inte stämma överänns med den nya..

Medlem sedan aug. 20011 087 inlägg
#17

oook detta funkar inte, vad gör jag fel? :D

function datechange(sPersID)
datechange = DateSerial(Left(sPersId, 2), Mid(sPersId, 3, 2), Mid(sPersId, 5, 2))
end function

Mysql = "Select email from kunder where DateDiff('yyyy', datechange(personnr), Date()) < 18"
set RS = connect.execute(mysql)

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[MySQL][ODBC 3.51 Driver][mysqld-4.1.5-gamma-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(personnr), Date()) < 18' at line 1
/pocketbike/minis.se/admin_email.asp, line 18

Medlem sedan aug. 20011 087 inlägg
#18

Personnr är ett databasfält..

Medlem sedan juni 200032 967 inlägg
#19

Du kan inte blanda ASP och SQL på det sättet.

Tillvägagångssättet får väl vara så här:
*) Mha ASP skapar du en SQL-fråga (en färdig sträng)
*) Den färdiga SQL-frågan exekveras.

För att använda din asp-funktion måste du alltså först hämta ut allt data, och sedan göra jämförelsen i ASP.

Medlem sedan aug. 20011 087 inlägg
#20

damnit..

137 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)