Datatyperna och skillnaderna mellan dem finns i dokumentationen . Den korta versionen är:
- DATE har precision ner till en sekund utan stöd för tidszon;
- TIMESTAMP har precision ner till bråkdelar av en sekund (upp till nio decimaler, men ditt operativsystem påverkar det också), fortfarande utan stöd för tidszon;
- TIMESTAMP WITH TIME ZONE har samma precision som TIMESTAMP men har också stöd för tidszon, som namnet antyder;
- TIDSSTÄMPEL MED LOKAL TIDZON justerar det lagrade värdet till och från den lokala tidszonen för skapande/frågande session.
Du kanske hittar den här artikeln intressant också.
När du jämför datetime-värden lagrade i din databas bör du använda värden av samma datatyp att jämföra mot. Du vill inte behöva konvertera alla värden i kolumnen för jämförelse, särskilt om kolumnen är indexerad. Om du har en DATUM-kolumn jämför då med ett DATUM - jämför inte som en sträng och lita inte på implicita konvertering av ett snöre. När du gör det:
WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'
du förlitar dig på att din NLS_DATE_FORMAT är DD-MON-YYYY och att din NLS_DATE_LANGUAGE är engelska. Om någon annan kör samma fråga i en annan session kan deras inställningar göra att frågan misslyckas (eller i vissa fall ge felaktiga resultat, vilket kan vara värre). För att undvika språkproblemet är det bättre att använda månadsnummer snarare än namn. Om du har en strängvariabel att jämföra mot bör du använda >TO_DATE()
för att konvertera strängen till ett DATUM med hjälp av en fast känd formatmask – lita inte på NLS. Om du har ett fast värde kan du göra detsamma, eller så kan du använda en datum bokstavlig
, vilket är kortare och entydigt.
Med det format du använde inkluderar du även alla rader som har kolumnen satt till midnatt den 1 januari 2000, men inte senare samma dag. Det kan vara vad du vill, men se till att du förstår hur MELLAN
Arbetar. Om du faktiskt letar efter datum inom det decenniet, inklusive när som helst den 31 december 1999, kan du använda:
WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'
För tidsstämplar kan du antingen använda TO_TIMESTAMP()
eller en bokstavlig tidsstämpel:
WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'
För tidsstämplar med tidszoner kan du antingen använda TO_TIMESTAMP_TZ ()
eller en bokstavlig tidsstämpel, med ett namns tidszonsområde:
WHERE tstz_col >= TIMESTAMP '1990-01-01 00:00:00 America/New_York'
AND tstz_col < TIMESTAMP '2000-01-01 00:00:00 America/New_York'