Som @Gordon sa, tidsstämplar (och datum) lagras inte i ett format som du skulle känna igen Oracle använder en intern representation som du aldrig riktigt behöver veta om eller undersöka (men det är dokumenterat om du är intresserad av sånt) .
När du frågar efter en tidsstämpel visas den med hjälp av din klients NLS-inställningar, såvida du inte har en klient som åsidosätter dessa. Jag kan ställa in min session så att den matchar 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
Och jag kan ändra det se vad du vill 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 allt du gör är att konvertera från en tidsstämpel med tidszon (vilket är vad systimestamp
is) till en sträng och sedan tillbaka till en tidsstämpel. Du förlorar tidszondelen och eventuella bråkdelar av sekunder; vilket du också kan göra med en cast
:
select cast(systimestamp as timestamp(0)) from dual;
CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32
Du kan se tidszonen och bråkdelen av sekunder med din standard timestamp_tz
format:
select systimestamp from dual;
SYSTIMESTAMP
------------------------------------
2018-07-10 15:37:33.776469000 +01:00
och ändra den med en annan 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
Vilket inte är helt relevant om man egentligen pratar om att lagra tidsstämplar i en tabell, men visar att det finns variationer.
Gör datatypen timestamp
i tabellen (eller timestamp with time zone
eller timestamp with local time zone
), och oroa dig bara för att formatera värdet som en sträng för presentation för slutanvändaren, i sista möjliga ögonblick.
När du behöver visa det, om visningsformatet är viktigt för dig, använd to_char()
med en explicit formatmask - anta inte att någon annan som kör dina frågor kommer att ha samma NLS-inställningar. Som du kan se är det lätt att ändra dessa för att ändra utdata. (De flesta klienter har ett sätt att låta dig ställa in standardinställningarna så att du inte behöver göra samma alter
kommandon varje gång du ansluter; t.ex. i SQL Developer, från Verktyg->Inställningar->Databas->NLS). Om du alltid vill visa samma format, använd något 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 också visar kolumnvärdet som filtreras (som en tidsstämpelstillbild) med hjälp av en tidsstämpel bokstavlig.