Typy danych i różnice między nimi są w dokumentacji . Krótka wersja to:
- DATA ma dokładność co do sekundy bez obsługi stref czasowych;
- TIMESTAMP ma precyzję do ułamków sekundy (do dziewięciu miejsc po przecinku, ale twój system operacyjny też na to wpływa), nadal bez obsługi stref czasowych;
- TIMESTAMP WITH TIME ZONE ma taką samą precyzję jak TIMESTAMP, ale jak sama nazwa wskazuje, obsługuje również strefy czasowe;
- ZNACZNIK CZASOWY Z LOKALNĄ STREFĄ CZASOWĄ dostosowuje przechowywaną wartość do iz lokalnej strefy czasowej sesji tworzenia/zapytania.
Możesz znaleźć ten artykuł też interesujące.
Za każdym razem, gdy porównujesz wartości daty i godziny przechowywane w twojej bazie danych, powinieneś używać wartości tego samego typu danych do porównania. Nie chcesz konwertować każdej wartości w kolumnie w celu porównania, zwłaszcza jeśli kolumna jest indeksowana. Jeśli masz kolumnę DATE, porównaj z DATE — nie porównuj jako ciąg i nie polegaj na niejawnym konwersja sznurka. Kiedy to zrobisz:
WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'
polegasz na tym, że NLS_DATE_FORMAT to DD-MON-RRRR, a NLS_DATE_LANGUAGE to język angielski. Jeśli ktoś inny uruchomi to samo zapytanie w innej sesji, jego ustawienia mogą spowodować niepowodzenie zapytania (lub w niektórych przypadkach podać błędne wyniki, co może być gorsze). Aby uniknąć problemów językowych, lepiej używać numerów miesięcy, a nie nazw. Jeśli masz zmienną ciągu do porównania, użyj TO_DATE()
przekonwertować ciąg na DATĘ przy użyciu stałej maski znanego formatu — nie polegaj na NLS. Jeśli masz stałą wartość, możesz zrobić to samo lub użyć liter daty
, który jest krótszy i jednoznaczny.
W formacie, którego użyłeś, uwzględniasz również wszystkie wiersze, których kolumna jest ustawiona na północ 1 stycznia 2000 r., ale nie później tego dnia. To może być to, czego chcesz, ale upewnij się, że rozumiesz, jak POMIĘDZY
Pracuje. Jeśli rzeczywiście szukasz dat w tej dekadzie, w tym w dowolnym momencie 31 grudnia 1999, możesz użyć:
WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'
W przypadku znaczników czasu możesz użyć TO_TIMESTAMP()
lub literał sygnatury czasowej:
WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'
W przypadku znaczników czasu ze strefami czasowymi możesz użyć TO_TIMESTAMP_TZ ()
lub literał sygnatury czasowej z nazwą regionu strefy czasowej:
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'