Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL-Unterschied zwischen TIMESTAMP, DATE UND TIMESTAMP WITH TIMEZONE?

Die Datentypen und Unterschiede zwischen ihnen sind in der Dokumentation . Die Kurzversion lautet:

  • DATE hat eine Genauigkeit von bis zu einer Sekunde ohne Zeitzonenunterstützung;
  • TIMESTAMP hat eine Genauigkeit bis auf Sekundenbruchteile (bis zu neun Dezimalstellen, aber Ihr Betriebssystem beeinflusst das auch), immer noch ohne Zeitzonenunterstützung;
  • TIMESTAMP WITH TIME ZONE hat dieselbe Genauigkeit wie TIMESTAMP, unterstützt aber auch Zeitzonen, wie der Name schon sagt;
  • TIMESTAMP WITH LOCAL TIME ZONE passt den gespeicherten Wert an und von der lokalen Zeitzone der erstellenden/abfragenden Sitzung an.

Vielleicht finden Sie diesen Artikel auch interessant.

Immer wenn Sie in Ihrer Datenbank gespeicherte datetime-Werte vergleichen, sollten Sie Werte desselben Datentyps zum Vergleichen verwenden. Sie möchten nicht jeden Wert in der Spalte für den Vergleich konvertieren müssen, insbesondere wenn die Spalte indiziert ist. Wenn Sie eine DATE-Spalte haben, dann vergleichen Sie mit einem DATE - vergleichen Sie nicht als String und verlassen Sie sich nicht auf implizite Konvertierung einer Saite. Wenn Sie dies tun:

WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'

Sie verlassen sich darauf, dass Ihr NLS_DATE_FORMAT TT-MON-JJJJ und Ihr NLS_DATE_LANGUAGE Englisch ist. Wenn jemand anderes dieselbe Abfrage in einer anderen Sitzung ausführt, können seine Einstellungen dazu führen, dass die Abfrage fehlschlägt (oder in einigen Fällen falsche Ergebnisse liefert, was schlimmer sein kann). Um das Sprachproblem zu vermeiden, ist es besser, Monatszahlen anstelle von Namen zu verwenden. Wenn Sie eine String-Variable zum Vergleichen haben, sollten Sie TO_DATE() Um die Zeichenfolge mit einer festen bekannten Formatmaske in ein DATE zu konvertieren, verlassen Sie sich nicht auf NLS. Wenn Sie einen festen Wert haben, können Sie dasselbe tun, oder Sie können einen Datumsliteral , was kürzer und eindeutig ist.

Mit dem von Ihnen verwendeten Format schließen Sie auch alle Zeilen ein, deren Spalte am 1. Januar 2000 auf Mitternacht eingestellt ist, aber nicht später an diesem Tag. Das ist vielleicht das, was Sie wollen, aber stellen Sie sicher, dass Sie verstehen, wie ZWISCHEN funktioniert. Wenn Sie tatsächlich nach Daten innerhalb dieses Jahrzehnts suchen, einschließlich jederzeit am 31. Dezember 1999, können Sie Folgendes verwenden:

WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'

Für Zeitstempel können Sie entweder TO_TIMESTAMP() oder ein Zeitstempel-Literal:

WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'

Für Zeitstempel mit Zeitzonen können Sie entweder TO_TIMESTAMP_TZ verwenden () oder ein Zeitstempel-Literal mit einer Namens-Zeitzonenregion:

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'