Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да получа това времево клеймо във формата, който искам, Oracle SQL

Както каза @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'

което също показва стойността на колоната, която се филтрира (като клеймо за време) с помощта на литерал за времево клеймо.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Стандартна алтернатива на CONNECT BY?

  2. Обаждането на корпоративна библиотека ODP.NET връща ORA-06502:PL/SQL:числова или стойностна грешка

  3. IN клауза за Oracle Prepared Statement в Python cx_Oracle

  4. GTT таблица статистика и SYS.WRI$_OPTSTAT_TAB_HISTORY

  5. Oracle SQL условно класиране