sql >> Databáze >  >> RDS >> Oracle

Jak získám toto časové razítko ve formátu, který chci, Oracle SQL

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.



  1. Nelze zkopírovat tabulku do jiné databáze pomocí pg_dump

  2. jak mám definovat sekvence v mém projektu (který používá hibernaci) tak, aby projekt fungoval s Oracle i Mysql.

  3. MySQL a PHP Neočekávaná T_Variable

  4. Jak získat další ID automatického zvýšení v mysql