Проблема с датой в оракуле

Я пытаюсь извлечь дату из одной таблицы в формате ISO, а затем сохранить ее в формате даты США?

Trunc(cast(to_timestamp(ATTRIBUTE_39,'yyyy-mm-dd"T"hh24:mi:ss.ff3"Z"')as date))

Фактический выход:

4/11/2018  12:00:00 AM

ожидаемый результат:

4/11/2018

Какие бывают типы данных?

William Robertson 11.04.2018 16:43

Не зная точно, что вы подразумеваете под «датой в формате ISO» или «датой в формате даты в США», я не думаю, что кто-нибудь может ответить на этот вопрос. ATTRIBUTE_39 - это date, timestamp или varchar2? Какой тип столбца вы вставляете?

William Robertson 12.04.2018 14:33
0
2
79
2

Ответы 2

Попробуй это:

select to_char(Trunc(cast(to_timestamp('2016-06-29T13:13:00.123','yyyy-mm-dd"T"hh24:mi:ss.ff3"Z"')as date)),'MM/DD/YYYY') from dual

форматирование даты и времени по умолчанию зависит от вашей настройки NLS_DATE_FORMAT.

I am trying to pull date from one table which is in ISO format and then store it in US date format?

Даты (и отметки времени) не имеют формата - они представлены в таблице по 7 байтов для даты или 20 байтов для отметки времени.

Вы можете получить значение как тип данных DATE, используя TO_TIMESTAMP_TZ и модели формата TZR или TZH:THM, чтобы соответствовать региону / смещению часового пояса (они оба будут работать с регионом часового пояса Zulu)

SELECT CAST( 
         TO_TIMESTAMP_TZ(
           ATTRIBUTE_39,
           'yyyy-mm-dd"T"hh24:mi:ss.ff3TZH:TZM'
         ) AT TIME ZONE 'UTC'               -- Convert to a common time zone
         AS DATE
       )
FROM   your_table;

Когда вы выбираете из таблицы, любая клиентская программа, которую вы используете (обычно), неявно преобразует 7-байты, которые она использует внутри, во что-то, что вы, пользователь, можете прочитать - строку. SQL / Plus и SQL Developer используют параметр сеанса NLS_DATE_FORMAT в качестве модели формата при выполнении этого неявного преобразования.

Таким образом, ваш запрос эффективно преобразуется в:

SELECT TO_CHAR(
         CAST( 
           TO_TIMESTAMP_TZ(
             ATTRIBUTE_39,
             'yyyy-mm-dd"T"hh24:mi:ss.ff3TZR'
           ) AT TIME ZONE 'UTC'
           AS DATE
         ),
         (
           SELECT VALUE
           FROM   NLS_SESSION_PARAMETERS
           WHERE  PARAMETER = 'NLS_DATE_FORMAT'
         )
       )
FROM   your_table;

Если вы хотите отформатировать дату или метку времени, вам придется явно преобразовать ее в строку с помощью TO_CHAR():

SELECT TO_CHAR(
         CAST( 
           TO_TIMESTAMP_TZ(
             ATTRIBUTE_39,
             'yyyy-mm-dd"T"hh24:mi:ss.ff3TZR'
           ) AT TIME ZONE 'UTC'
           AS DATE
         ),
         'MM/DD/YYYY'
       )
FROM   your_table;

Или изменив параметр сеанса NLS_DATE_FORMAT:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

(Имейте в виду, что это изменит формат только в текущем сеансе и не изменит его для других сеансов / пользователей.)

Другие вопросы по теме