Jak řekl @Gordon, časová razítka (a data) nejsou uložena ve formátu, o kterém byste poznali, že Oracle používá interní reprezentaci, o které ve skutečnosti nemusíte vědět ani ji zkoumat (ale je to zdokumentováno, pokud vás taková věc zajímá) .
Když zadáte dotaz na časové razítko, zobrazí se pomocí nastavení NLS vašeho klienta, pokud nemáte klienta, který je přepíše. Mohu nastavit svou relaci tak, aby odpovídala tomu, co vidíte:
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
A můžu to změnit a vidět to, co chcete vidět:
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 vše, co děláte, je převod z časového razítka s časovým pásmem (což je systimestamp
is) na řetězec a poté zpět na časové razítko. Ztrácíte část časového pásma a případné zlomky sekund; což můžete také provést pomocí cast
:
select cast(systimestamp as timestamp(0)) from dual;
CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32
Pomocí výchozího parametru timestamp_tz
můžete zobrazit časové pásmo a zlomky sekund formát:
select systimestamp from dual;
SYSTIMESTAMP
------------------------------------
2018-07-10 15:37:33.776469000 +01:00
a změňte jej pomocí jiného 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ž není úplně relevantní, pokud opravdu mluvíte o ukládání časových razítek v tabulce, ale ukazuje, že existují varianty.
V tabulce zadejte datový typ timestamp
(nebo timestamp with time zone
nebo timestamp with local time zone
) a starejte se pouze o formátování hodnoty jako řetězce pro prezentaci koncovému uživateli na poslední možnou chvíli.
Když jej potřebujete zobrazit, pokud je pro vás formát zobrazení důležitý, použijte to_char()
s explicitní maskou formátu – nepředpokládejte, že někdo jiný, kdo spouští vaše dotazy, bude mít stejné nastavení NLS. Jak vidíte, je snadné je změnit a upravit výstup. (Většina klientů má způsob, jak vám umožnit nastavit výchozí hodnoty, takže nemusíte dělat totéž alter
příkazy při každém připojení; např. v SQL Developer, z Nástroje->Předvolby->Databáze->NLS). Pokud chcete vždy zobrazovat stejný formát, použijte něco jako:
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'
který také zobrazuje filtrovanou hodnotu sloupce (jako stále časové razítko) pomocí literálu časového razítka.