Както каза @Gordon, времевите марки (и датите) не се съхраняват във формат, който бихте разпознали, Oracle използва вътрешно представяне, за което никога не трябва да знаете или да проучвате (но е документирано, ако се интересувате от такива неща) .
Когато заявите клеймо за време, то се показва с помощта на NLS настройките на вашия клиент, освен ако нямате клиент, който ги заменя. Мога да настроя сесията си така, че да съответства на това, което виждате:
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
И мога да го променя, за да видите какво искате да видите:
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
Но всичко, което правите, е да конвертирате от клеймо за време с часова зона (което е това, което systimestamp
е) към низ и след това обратно към клеймо за време. Губите частта от часовата зона и части от секунди; което бихте могли да направите и с cast
:
select cast(systimestamp as timestamp(0)) from dual;
CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32
Можете да видите часовата зона и част от секундите с вашия timestamp_tz
по подразбиране формат:
select systimestamp from dual;
SYSTIMESTAMP
------------------------------------
2018-07-10 15:37:33.776469000 +01:00
и го променете с различен 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
Което не е съвсем уместно, ако наистина говорите за съхраняване на времеви отпечатъци в таблица, но показва, че има вариации.
Във вашата таблица създайте тип данни timestamp
(или timestamp with time zone
или timestamp with local time zone
) и се тревожете само за форматирането на стойността като низ за представяне на крайния потребител в последния възможен момент.
Когато трябва да го покажете, ако форматът на показване е важен за вас, използвайте to_char()
с изрична маска за формат - не предполагайте, че някой друг, изпълняващ вашите заявки, ще има същите NLS настройки. Както можете да видите, лесно е да ги промените, за да промените изхода. (Повечето клиенти имат начин да ви позволят да зададете настройките по подразбиране, така че да не се налага да правите същото alter
команди всеки път, когато се свържете; напр. в SQL Developer, от Инструменти->Предпочитания->База данни->NLS). Ако искате винаги да показвате един и същ формат, използвайте нещо като:
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'
което също показва стойността на колоната, която се филтрира (като клеймо за време) с помощта на литерал за времево клеймо.