Avatar billede jtjansen Nybegynder
01. april 2008 - 20:38 Der er 6 kommentarer

streng i stedet for to_date

Jeg har altid bare brugt en streng på formen yyyymmdd når jeg skulle sammenligne dato'er i Oracle, i stedet for to_date('20080401', 'yyyymmdd'). Men er det sikkert? Vil det altid virke?

Fx.

select * from users where birth > '20080401'
Avatar billede holdam Nybegynder
01. april 2008 - 21:44 #1
Det kommer an på værdien af NLS_DATE_FORMAT. Denne parameter fastlægger standarddatoformatet og så længe NLS_DATE_FORMAT stemmer overens med det format du anvender i dine strenge, burde det virke idet Oracle konverterer din streng til en dato under anvendelse af formatet i NLS_DATE_FORMAT.

Men det sikreste er at teste med TO_CHAR, eller som det hedder i dokumentationen: "Oracle recommends that you specify explicit conversions"
Avatar billede Slettet bruger
01. april 2008 - 23:36 #2
Hvis du skal arbejde med dato uden tid (kl. 00:00) kan du bruge en kortere notation.

I stedet for

select * from users where birth > to_date('20080401', 'RRRRMMDD')

kan du skrive

select * from users where birth > DATE '2008-04-01'

Det er lidt kortere, fordi du ikke skal skrive det forventede format. Det er altid på formen 'YYYY-MM-DD'.

Hvad sker der forresten, når du skriver

select * from users where birth > '20080401'?

Er birth et dato-felt? Konverteres birth så til et tekst-felt, der sammenlignes med teksten '20080401', eller konverteres '20080401' til en dato? Det har betydning, fordi det jo vil være nemmere en gang for alle at konveretere '20080401' til en dato fremfor at konvertere alle birth-felter i rækkerne i tabellen users til en stren.
Avatar billede holdam Nybegynder
03. april 2008 - 08:27 #3
Når Oracle sammenligner datoer med tekster, er det teksten der konverteres til en dato:

"When comparing a character value with a DATE value, Oracle converts the character data to DATE."
Avatar billede jtjansen Nybegynder
03. april 2008 - 12:11 #4
Ja, jeg har aldrig haft problemer med at den laver en streng sammenligning i stedet for en dato sammenligning. Jeg tror ikke engang at vores NLS_DATE_FORMAT er sat til yyyymmdd.
Avatar billede jtjansen Nybegynder
22. april 2008 - 11:11 #5
Er der nogen der tør sige at følgende altid vil virke?

select * from users where birth > '20080401'
Avatar billede Slettet bruger
24. april 2008 - 08:32 #6
Ja! Jeg tør godt sige at det kun vil virke hvis NLS_LANG etc. er under kontrol. Og du vil altid risikere at der sker noget uventet. Hvis fx database flyttes til ny server med andre regional settings eller hvis dit statement bliver udført fra en session på en anden maskine end ellers. Du bør altid skrive enten to_char('20080401', 'YYYYMMDD') eller DATE '2008-04-01'.
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