Jak powiedział @Gordon, znaczniki czasu (i daty) nie są przechowywane w formacie, który rozpoznałbyś, że Oracle używa wewnętrznej reprezentacji, o której tak naprawdę nigdy nie musisz wiedzieć ani badać (ale jest to udokumentowane, jeśli jesteś zainteresowany tego rodzaju rzeczami) .
Gdy wysyłasz zapytanie o znacznik czasu, jest on wyświetlany przy użyciu ustawień NLS Twojego klienta, chyba że masz klienta, który je zastępuje. Mogę ustawić moją sesję tak, aby pasowała do tego, co widzisz:
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
I mogę to zmienić, aby zobaczyć, co chcesz zobaczyć:
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
Ale wszystko, co robisz, to konwertowanie ze znacznika czasu ze strefą czasową (co jest tym, co systimestamp
is) do ciągu, a następnie z powrotem do znacznika czasu. Tracisz część strefy czasowej i ułamki sekund; co możesz również zrobić za pomocą cast
:
select cast(systimestamp as timestamp(0)) from dual;
CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32
Możesz zobaczyć strefę czasową i ułamki sekund z domyślnym timestamp_tz
format:
select systimestamp from dual;
SYSTIMESTAMP
------------------------------------
2018-07-10 15:37:33.776469000 +01:00
i zmień go innym 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
Co nie jest do końca istotne, jeśli naprawdę mówisz o przechowywaniu znaczników czasu w tabeli, ale pokazuje, że istnieją różnice.
W tabeli ustaw typ danych timestamp
(lub timestamp with time zone
lub timestamp with local time zone
) i martw się tylko o sformatowanie wartości jako ciągu do prezentacji użytkownikowi końcowemu w ostatnim możliwym momencie.
Kiedy musisz go wyświetlić, jeśli format wyświetlania jest dla Ciebie ważny, użyj to_char()
z jawną maską formatu — nie zakładaj, że ktokolwiek inny uruchamiający Twoje zapytania będzie miał te same ustawienia NLS. Jak widać, łatwo je zmienić, aby zmodyfikować dane wyjściowe. (Większość klientów umożliwia ustawienie wartości domyślnych, więc nie musisz robić tego samego alter
polecenia za każdym razem, gdy się łączysz; np. w SQL Developer, z Tools->Preferences->Database->NLS). Jeśli chcesz zawsze wyświetlać ten sam format, użyj czegoś takiego:
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'
który pokazuje również filtrowaną wartość kolumny (jako znacznik czasu) przy użyciu literału znacznika czasu.