Изменить существующий формат даты to_char

Oracle SQL автоматически преобразует мое поле D.START_DT в следующий формат:

TO_CHAR(D.START_DT,'YYYY-MM-DD')

Что затрудняет изменение моего собственного формата даты.

Я попытался обернуть вокруг него еще один TO_CHAR, но безуспешно.

TO_CHAR(TO_CHAR(D.START_DT,'YYYY-MM-DD'), 'MM/DD')

И я пытался SUBSTR выбрать определенные символы, но безуспешно. Я думаю, что дефис мешает.

SUBSTR(TO_CHAR(D.START_DT,'YYYY-MM-DD'), 6, 7) || '/' || SUBSTR(TO_CHAR(D.START_DT,'YYYY-MM-DD'), 9, 10)

Каков обходной путь для этого?


person O P    schedule 01.04.2013    source источник
comment
Можете ли вы использовать функцию Oracle REPLACE?   -  person mechanical_meat    schedule 01.04.2013
comment
Пока мне не удалось.   -  person O P    schedule 01.04.2013
comment
Вы можете изменить формат по умолчанию на любой другой: forums.oracle.com/forums /thread.jspa?threadID=680596 Не уверен, что вы подразумеваете под «Oracle SQL автоматически преобразует мое поле D.START_DT в xxxx». Если ваше поле имеет тип DATE, то почему вы можете передать его непосредственно в функцию TO_DATE с помощью нужный вам формат. Пожалуйста, уточните свой вопрос и покажите полный исходный SQL-запрос, который вы пытаетесь выполнить.   -  person OldProgrammer    schedule 01.04.2013
comment
Почему: TO_CHAR(TO_CHAR(D.START_DT,'ГГГГ-ММ-ДД'), 'ММ/ДД') ? Почему бы не использовать: TO_CHAR(D.START_DT,'MM/DD')? Что именно ты пытаешься сделать?   -  person DiscoInfiltrator    schedule 01.04.2013
comment
@DiscoInfiltrator, потому что он преобразует TO_CHAR(D.START_DT,'MM/DD') в TO_CHAR(TO_CHAR(D.START_DT,'YYYY-MM-DD'), 'MM/DD').   -  person O P    schedule 01.04.2013
comment
Итак, всякий раз, когда вы пытаетесь использовать D.START_DT, он автоматически преобразуется в строку символов фиксированной длины? Какой тип у D.START_DT?   -  person DiscoInfiltrator    schedule 01.04.2013
comment
@OP - что его конвертирует? Обычный SQL, SQL * Plus, SQL Developer и т. д. не делают того, что вы, кажется, описываете, так что есть ли какой-то другой инструмент или среда, в которой вы видите это поведение?   -  person Alex Poole    schedule 01.04.2013
comment
@DiscoInfiltrator, это правильно. D.START_DT — это тип даты.   -  person O P    schedule 01.04.2013
comment
@ Алекс Пул, я использую диспетчер запросов.   -  person O P    schedule 01.04.2013


Ответы (2)


Тип данных DATE не имеет формата. Когда вы видите дату, напечатанную на экране, значит, что-то ПРИМЕНЯЕТ формат, который вы видите. Может быть «по умолчанию» в используемой вами программе (например, SQL Developer) или в настройках NLS и т. д. Но тип данных DATE не имеет формата. Таким образом, у вас есть полный контроль над форматом, который вы видите на экране.

Самый простой — использовать функцию TO_CHAR:

выберите TO_CHAR(D.START_DT,'YYYY') из двойного;

возвращает только четырехзначный год.

См. параметры формата даты TO_CHAR.

http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements004.htm#CDEHIFJA

Вы всегда должны указывать формат в своем коде, а не полагаться на какое-то другое «по умолчанию» для его предоставления.

person RMAN Express    schedule 01.04.2013

Я согласен с RMAN Express и не вижу проблем с преобразованием дат в любой формат, который вам нужен... Если у вас все еще есть проблемы, попробуйте это (сначала to_char() во внешнем запросе необязательно):

SELECT to_char(to_date(some_date, 'YYYY-MM-DD'), 'MM/DD') final_date
  FROM
  (
  SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') some_date -- this is your "auto converted" date 
   FROM dual
  )
 /
person Art    schedule 01.04.2013