Som @Gordon sagde, gemmes tidsstempler (og datoer) ikke i et format, du ville genkende, at Oracle bruger en intern repræsentation, som du aldrig rigtig behøver at vide om eller undersøge (men det er dokumenteret, hvis du er interesseret i den slags) .
Når du forespørger på et tidsstempel, vises det ved hjælp af din klients NLS-indstillinger, medmindre du har en klient, der tilsidesætter disse. Jeg kan indstille min session til at matche det, du ser:
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
Og jeg kan ændre det, se hvad du vil se:
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
Men alt hvad du gør er at konvertere fra et tidsstempel med tidszone (som er det systimestamp
is) til en streng og derefter tilbage til et tidsstempel. Du mister tidszonedelen og eventuelle brøkdele sekunder; hvilket du også kunne gøre med en cast
:
select cast(systimestamp as timestamp(0)) from dual;
CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32
Du kan se tidszonen og brøkdelen af sekunder med din standard timestamp_tz
format:
select systimestamp from dual;
SYSTIMESTAMP
------------------------------------
2018-07-10 15:37:33.776469000 +01:00
og ændre det med en anden 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
Hvilket ikke er helt relevant, hvis du virkelig taler om at gemme tidsstempler i en tabel, men viser, at der er variationer.
Lav datatypen timestamp
i din tabel (eller timestamp with time zone
eller timestamp with local time zone
), og kun bekymre dig om at formatere værdien som en streng til præsentation for slutbrugeren på det sidste mulige tidspunkt.
Når du har brug for at vise det, hvis visningsformatet er vigtigt for dig, så brug to_char()
med en eksplicit formatmaske - antag ikke, at nogen andre, der kører dine forespørgsler, vil have de samme NLS-indstillinger. Som du kan se, er det nemt at ændre dem for at ændre outputtet. (De fleste klienter har en måde at lade dig indstille standardindstillingerne, så du ikke behøver at gøre det samme alter
kommandoer hver gang du opretter forbindelse; for eksempel. i SQL Developer, fra Værktøjer->Indstillinger->Database->NLS). Hvis du altid vil vise det samme format, så brug noget som:
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'
som også viser kolonneværdien, der filtreres (som et tidsstempel) ved hjælp af et tidsstempel.