Неверный номер при преобразовании даты в другой формат

#sql #oracle #date #oracle-sqldeveloper #oracle19c

Вопрос:

У меня есть этот запрос, и я пытаюсь отформатировать все даты для двух столбцов, упомянутых в приведенном ниже запросе, в указанный формат:

 SELECT
    TO_DATE(TO_CHAR(timeone,'YYYY-MM-DD HH:MI PM'),'DD-MM-YYYY HH:MIPM'), 
    TO_DATE(TO_CHAR(timetwo,'YYYY-MM-DD HH:MI PM'),'DD-MM-YYYY HH:MIPM')
FROM
    my_date_table
WHERE daywork = '28-MAY-2021';
 

и я хочу преобразовать результаты из timeone и timetwo в другой формат даты DD-MM-YYYY HH:MIPM , но когда я запустил запрос, я получил неверный номер. Тип данных столбцов timeone и timetwo в моей таблице-дата

Когда я запускаю запрос без форматирования, результаты:

введите описание изображения здесь

Где я ошибся?. Все альтернативы и решения приветствуются

Комментарии:

1. Даты хранятся во внутреннем формате, поэтому неясно, что вы пытаетесь сделать. Похоже, вы просто хотите преобразовать дату в строку.

2. @GordonLinoff Ну, я просто пытаюсь изменить формат результатов на картинке, поэтому запрос-это то, что я использовал, чтобы попытаться изменить формат на нужный мне формат. итак, изображение с результатами-ГГГГ-ММ-ДД ЧЧ:МИ:СС, но я хочу, чтобы это было ДД-ММ-ГГГГ ЧЧ:МИ ПМ

3. Какие типы данных являются вашими столбцами timeone и timetwo? Если это строки, то (а) это не очень хорошая идея и (б) у вас просто свой to_date() и to_char() неправильный путь.

4. Как вы можете видеть выше, я упомянул, что типы данных-это даты

5. Похоже, тебе просто нужно to_char(timeone, 'DD-MM-YYYY HH:MI PM') . Это преобразует значение даты Oracle в строку в формате 'DD-MM-YYYY HH:MI PM' . Кроме того, поскольку вы отметили Oracle SQL Developer, вы можете перейти в раздел NLS настроек и установить его в качестве формата отображения дат.

Ответ №1:

Тип данных столбцов timeone и timetwo в моей таблице-дата

Ошибка говорит, что это не так; они кажутся строками. В качестве свидания это сработало бы:

 SELECT
    TO_CHAR(CAST(TIMESTAMP '2021-05-28 07:34:00' AS DATE),'YYYY-MM-DD HH:MI PM')
FROM
    dual

TO_CHAR(CAST(TIMESTAMP'2021-05-2807:34:00'ASDATE),'YYYY-MM-DDHH:MIPM')
----------------------------------------------------------------------
2021-05-28 07:34 AM
 

но в виде строки это приведет к ошибке, которую вы видите:

 SELECT
    TO_CHAR('2021-05-28 07:34:00','YYYY-MM-DD HH:MI PM')
FROM
    dual

ORA-01722: invalid number
 

Итак, вы действительно пытаетесь преобразовать одно строковое представление даты в строковое представление другого формата. Для этого вам нужен вызов внутренней функции to_date() , а вызов внешней функции to_char() — у вас неправильный способ:

 SELECT
    TO_CHAR(TO_DATE(timeone,'YYYY-MM-DD HH24:MI:SS'),'DD-MM-YYYY HH:MIPM') as convertedone, 
    TO_CHAR(TO_DATE(timetwo,'YYYY-MM-DD HH24:MI:SS'),'DD-MM-YYYY HH:MIPM') as convertedtwo
FROM
    my_date_table
WHERE daywork = date '2021-05-28'

CONVERTEDONE       CONVERTEDTWO
------------------ ------------------
28-05-2021 07:34AM 28-05-2021 03:30PM
28-05-2021 07:04AM 28-05-2021 07:04AM
 

Модель формата для to-date() вызова также должна соответствовать фактическому строковому значению, поэтому я изменил ее на 'YYYY-MM-DD HH24:MI:SS' . И '28-MAY-2021' также является строкой, а не датой, поэтому — предполагая, что это действительно поле даты — я изменил его на литерал даты. Вы также можете использовать to_date() значение в этой строке, но с литералом это проще (и если вы указываете название месяца, вам также следует указать язык даты).

бд<>скрипка<>.