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

Wie erhalte ich diesen Zeitstempel im gewünschten Format, Oracle SQL

Wie @Gordon sagte, werden Zeitstempel (und Daten) nicht in einem Format gespeichert, von dem Sie erkennen würden, dass Oracle eine interne Darstellung verwendet, die Sie nie wirklich kennen oder untersuchen müssen (aber es ist dokumentiert, wenn Sie an so etwas interessiert sind). .

Wenn Sie einen Zeitstempel abfragen, wird er mit den NLS-Einstellungen Ihres Clients angezeigt, es sei denn, Sie haben einen Client, der diese überschreibt. Ich kann meine Sitzung so einrichten, dass sie mit dem übereinstimmt, was Sie sehen:

alter session set nls_timestamp_format = 'DD-MON-RR HH.MI.SS.FF AM';

select to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_CHAR(SYSTIMESTAM
-------------------
2018-07-10 15:37:31

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHAR(SYSTIMESTA
-------------------------------
10-JUL-18 03.37.31.000000000 PM

Und ich kann es ändern, um zu sehen, was Sie sehen möchten:

alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS';

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHA
-------------------
2018-07-10 15:37:32

Aber alles, was Sie tun, ist die Konvertierung von einem Zeitstempel mit Zeitzone (was systimestamp is) in eine Zeichenfolge und dann zurück in einen Zeitstempel. Sie verlieren den Teil der Zeitzone und alle Sekundenbruchteile; was man auch mit einem cast machen könnte :

select cast(systimestamp as timestamp(0)) from dual;

CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32

Sie können die Zeitzone und Sekundenbruchteile mit Ihrem standardmäßigen timestamp_tz sehen Format:

select systimestamp from dual;

SYSTIMESTAMP                        
------------------------------------
2018-07-10 15:37:33.776469000 +01:00

und ändern Sie es mit einem anderen alter :

alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM';

select systimestamp from dual;

SYSTIMESTAMP                  
------------------------------
2018-07-10 15:37:34.070 +01:00

Was nicht ganz relevant ist, wenn Sie wirklich über das Speichern von Zeitstempeln in einer Tabelle sprechen, aber zeigt, dass es Variationen gibt.

Machen Sie in Ihrer Tabelle den Datentyp timestamp (oder timestamp with time zone oder timestamp with local time zone ), und kümmern Sie sich erst im letztmöglichen Moment um die Formatierung des Werts als Zeichenfolge zur Präsentation für den Endbenutzer.

Wenn Sie es anzeigen müssen und das Anzeigeformat für Sie wichtig ist, verwenden Sie to_char() mit einer expliziten Formatmaske - gehen Sie nicht davon aus, dass jemand anderes, der Ihre Abfragen ausführt, dieselben NLS-Einstellungen hat. Wie Sie sehen können, ist es einfach, diese zu ändern, um die Ausgabe zu ändern. (Bei den meisten Clients können Sie die Standardeinstellungen festlegen, sodass Sie nicht denselben alter müssen Befehle bei jeder Verbindung; z.B. in SQL Developer, von Tools->Preferences->Database->NLS). Wenn Sie immer dasselbe Format anzeigen möchten, verwenden Sie etwas wie:

select to_char(your_column, 'YYYY-MM-DD HH24:MI:SS') as column_alias
from your_table
where your_column < timestamp '2018-01-01 00:00:00'

die auch den gefilterten Spaltenwert (als Zeitstempel noch) mit einem Zeitstempel-Literal anzeigt.