2015-12-01 4 views
0

Необходимо приобрести YYYY-MM SYSDATE и загрузить в столбец (Data_Type = Date). Следующий запрос дает требуемый результат, однако, преобразование в строковый тип данных в этом процессе.Преобразование формата даты при сохранении типа данных - Oracle

SELECT TO_CHAR(SYSDATE, 'YYYY-MM') FROM DUAL; 

Любой способ сохранить Дата тип_данных & SYSDATE как сбора по YYYY-MM чисто с помощью оракула

+0

Как это дубликат? – Rene

+0

@Rene Потому что, ** Oracle не хранит даты в формате, который вы видите. Он хранит его внутренне в 7 байт с каждым байтом, хранящим разные компоненты значения datetime. ** Если вы хотите отобразить, используйте TO_CHAR с подходящей моделью FORMAT. При вставке используйте TO_DATE с подходящей моделью FORMAT. Что вы видите в качестве формата по умолчанию, являются вашими настройками NLS для вашей локали. Я вижу ваш ответ и, честно говоря, 'SELECT to_date (TO_CHAR (SYSDATE, 'YYYY-MM'), 'YYYY-MM') FROM DUAL' - это просто глупо. –

ответ

-1

преобразовать его обратно в дату.

SELECT to_date(TO_CHAR(SYSDATE, 'YYYY-MM'),'YYYY-MM') FROM DUAL 

Конечно, чтобы быть допустимой датой, должен быть компонент дня. Это будет установлено на 1.

В качестве альтернативы, почему бы не просто сохранить sysdate? В следующий раз, когда вы посмотрите на эту ценность, вас будут интересовать только год и месяц.

+1

'SELECT to_date (TO_CHAR (SYSDATE, 'YYYY-MM'), 'YYYY-MM') FROM DUAL' Почему? Это можно сделать просто с помощью TRUNC. Кстати, ** по сути, форматирование даты не имеет ничего общего с ее хранением **. –

+0

Также, чтобы прояснить ситуацию. Я не проголосовал. Я согласен с вашим первым утверждением: «* Преобразуйте его обратно в дату» *. Но, как я уже сказал, в этом нет необходимости. Что нужно, чтобы преобразовать дату в строку, а затем, снова преобразовать ее обратно на сегодняшний день. Это слишком сложно! –

+0

Мне показалось, что я сделал это ясно с моим последним замечанием. – Rene

1

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

Если вы хотите сэкономить только месяц с днем ​​и днем ​​1 и полночь, trunc(date_value, 'month'). Fomat models for round and trunc date.

+0

Первое предложение хорошее. Тем не менее, это - "* Форматы вступают в игру только при преобразовании из укуса. *" Не совсем верно, так как это применимо и наоборот. Если вы хотите знать, почему? Тогда ответ будет ** зависимость NLS **. Лучший способ обработки дат (если не задействовано время), используйте ** ANSI Date literal **, который использует фиксированный формат '' YYYY-MM-DD''. поэтому ** NLS независимый **. –

+0

@LalitKumarB Я думаю, что «из» в «из строки» была опечаткой, и она должна была читать «до строки или из нее», поэтому Шеннон покрыл оба направления преобразования. Я хотел бы не согласиться с вашим мнением о том, что «лучший» способ обработки дат - через букву ANSI date; Я лично считаю, что гораздо проще читать (и писать) код, используя to_date при работе со строками-это-действительно-даты, особенно потому, что вам не нужно беспокоиться об изменении подхода к тому, имеет ли время время или нет , Но, очевидно, YMMV на тот момент! * {:-) – Boneist

+0

@Boneist * * Я лично считаю, что гораздо проще читать (и писать) код, используя to_date при работе со строками-это-действительно-даты * «Даже мне было легче, пока я не нашел, что ** ANSI date literal ** действительно является благом, когда мне приходилось кодировать моих «французских, русских, египетских и т. Д.» Клиентов, которые не заботились о ** временном элементе ** :-) Поэтому я 't должен упоминать 'NLS_DATE_LANGUAGE' каждый раз, когда я кодирую для этих клиентов. –