#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()
значение в этой строке, но с литералом это проще (и если вы указываете название месяца, вам также следует указать язык даты).