Oracle
 sql >> Baza danych >  >> RDS >> Oracle

SQL- Różnica między TIMESTAMP, DATE I TIMESTAMP WITH TIMEZONE?

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'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pomylony z dbms_xplan.display

  2. Dialekt hibernacji dla Oracle Database 11g?

  3. Strategia poprawy wydajności Oracle DELETE

  4. Wyzwanie testowania bazy danych Oracle — Porównaj dane schematu

  5. Wykonaj natychmiast z typem innym niż SQL