Avatar billede lasserasch Juniormester
11. februar 2007 - 23:27 Der er 8 kommentarer og
1 løsning

Konvertere en VARCHAR til Datetime i SELECT sætningen.

Hejsa.

Jeg skal have lavet et udtræk fra min SQL DB, hvor udtrækket skal indeholde : Fuldt Navn, Fødselsdagsdato, Ansættelsesdato.

Udtrækket skal gerne sorteres efter fødselsdagsdato.

Mit problem er at Fødselsdagsdato ligger i SQL databasen som VARCHAR værdier. Kan man konvertere disse til DATETIME mens man laver SQL udtrækket?

Jeg er ikke videre hård til SQL udtræk, men går ud fra at hvis man skriver "SELECT * FROM medarbejderdb ORDER BY fødselsdato", og fødselsdato var et DATETIME felt, så ville den sortere korrekt efter fødselsdato ik'???

Jeg ved godt at det er noget mærkeligt noget at det ligger som VARCHAR, men det er nogle data, som kommer fra vores gamle AS/400 løn system. Det er desværre ikke muligt at lave udtrækket herfra til andet end VARCHAR felter.


/Lasse
Avatar billede arne_v Ekspert
11. februar 2007 - 23:30 #1
hvis datoerne er gemt i det rigtige format er det nemt at caste til DATETIME ellers
skal du til at SUBSTRING'e og plusse dem til noget der kan

ja ORDER BY datetimefelt sorterer rigtigt
Avatar billede lasserasch Juniormester
11. februar 2007 - 23:54 #2
Ok, men hvordan ser syntaks ud hvis man skal konvertere fra VARCHAR til DATETIME i ens SQL sætning?

Mine VARCHAR felter ser således ud : '291207' for 29. December 2007. Og for at det ikke skal være løgn, så ser de således ud hvis dag starter med 0, f.eks. ville 6. December 2007 se således ud i min database '61207'

/Lasse
Avatar billede arne_v Ekspert
12. februar 2007 - 00:00 #3
hvad hvis måneden kun er på 1 ciffer ?
Avatar billede arne_v Ekspert
12. februar 2007 - 00:07 #4
eksempel:

1> select cast('110207' as datetime)
2> go

-----------------------
2011-02-07 00:00:00.000

(1 row affected)
1> select cast(substring('110207',5,2)+substring('110207',3,2)+substring('110207',1,2) as datetime)
2> go

-----------------------
2007-02-11 00:00:00.000

(1 row affected)

'110207' er naturligvis et felt og ikke en konstant hos dig
Avatar billede lasserasch Juniormester
12. februar 2007 - 01:47 #5
Hvis måneden er på et ciffer, så er der stadig et nul i.
Hvordan tager jeg højde for det så? Og det samme med dato. Det er der ikke taget højde for i overstående eksempel er der?

Jeg kan ikke lige teste før i morgen, men har jeg forstået det rigtigt hvis sætningen skal se sådan ud, når vi ser bort fra manglende nul værdi i dato feltet?

"SELECT Navn, cast(substring(birthday,5,2)+substring(birthday,3,2)+substring(birthday,1,2) as datetime) AS Fødselsdato from medarbejderdb"

/Lasse
Avatar billede lasserasch Juniormester
12. februar 2007 - 01:49 #6
Sikker noget vrøvl jeg skriver.

Dette
------------
Hvordan tager jeg højde for det så? Og det samme med dato. Det er der ikke taget højde for i overstående eksempel er der?
------------

skulle have været

------------
Hvordan tager jeg højde for 0 i dato værdien så?
Det er der ikke taget højde for i overstående eksempel er der?
------------

/Lasse
Avatar billede arne_v Ekspert
12. februar 2007 - 01:59 #7
nej

du kunne tælles baglæns udfra længden

cast(substring(birthday,len(birthday)-1,2)+substring(birthday,len(birthday)-3,2)+substring(birthday,1,len(birthday)-4) as datetime)
Avatar billede lasserasch Juniormester
12. februar 2007 - 17:13 #8
Nå, jeg endte op med en anden løsning.

Fandt ud af at alle vores udlandske afdelinger, der står fødselsdato i et andet felt i løn systemet da de ikke har noget CPR nr. som i Danmark. Så derfor blev det lige pludselig lidt svært at sortere på fødselsdato i SQL sætningen når fødselsdatoer kan ligge i 2 forskellige felter.

Lagde mit udtræk ind i et dataset i stedet for, hvor jeg så fik samlet fødselsdatoer i et felt. Herefter rendte jeg mit dataset igennem med en .select kommando og sorterede på fødselsdato, og oprettede så min slut fil ud fra dette loop.

Men smid et svar alligevel! For indsatsens skyld :-)

/Lasse
Avatar billede arne_v Ekspert
12. februar 2007 - 17:37 #9
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester