Oracle sql developer формат даты

Обновлено: 07.07.2024

Литералы служат для непосредственного представления данных, ниже приведен список
стандартных литерал:

Двойной апостроф интерпретируется в строковой литерале как апостроф в тексте.

Интервал времени

Синтаксис и реализация интервалов отличается на разных СУБД.

Oracle

PostgreSQL

интервалы указываются в виде строки, в которой перечисляются значение и тип промежутка:

Слова можно употреблять и во множественном числе.
Если интервал начинается с дней, то можно использовать короткий формат строки как
в Oracle для дневных интервалов.

MySQL

Только сложные интервалы, состоящие из более одного типа промежутков, указываются в строке.
Для этих целей введены дополнительные по сравнению с PostgreSQL имена для промежутков:

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

Выражения и операции

cтроковые операции

алгебраические операции

Ко времени можно прибавлять целое число, но результат зависит от конкретной СУБД.

операции отношения

логические операции и предикаты

выражение IN (значение1. значениеn)

В качестве множества значений может служить корректная выборка

условные выражения

Ниже приведен пример использования выражения в запросе выбора данных.

прочие операции

В каждой СУБД свой набор операций, выше были приведены наиболее употребительные.
Например, в PosgreSQL можно использовать и такие операции:

Обзор функций

математические функции

Тригонометрические функции работают с радианами:

строковые функции

работа с датами

В рассматриваемых СУБД для обработки времени мало общего. Самый минимум у Oraсle:

Ниже приведены допустимые форматы в строковом параметре s для функций trunc и date_trunc соответственно:

Такие функции как last_day в других СУБД реализуются с помощью арифметики времени и преобразования типов.
Так что при желании можно написать соответствующую функцию. Ниже приведена выборка последнего дня указанной даты.

Преобразование типов

Множество типов разрешенные для преобразования в констркуции CAST AS определяется
реализацией СУБД. Так в MySQL может преобразовать только следующие типы: binary[(n)],
char[(n)], date, datetime, decimal[(m[,d])], signed [integer], time, unsigned [integer].
А в Oracle, кроме преобразования встроенных типов, можно преобразовывать выборки со
множеством записей в массивы.

В PostgreSQL более расширенные возможности по преобразованию. Во-первых, можно добавить
собственное преобразование для встроенных и пользовательских типов. Во-вторых, есть
собственный более удобный оператор преобразования типов .

В большинстве случае необходимо преобразование в строку либо из строки. Для этого случаяСУБД предоставляют дополнительные функции.

функции Oracle

Формат числовой строки задается следующими элементами:

функции PostgreSQL

Основные элементы форматирования совпадают с Oracle.

функции MySQL

При хранении даты в MySQL под типом Date (), она имеет формат 2011-07-11 (год-месяц-день). В некоторых случаях даже не имея разделителя 20110711.

Поскольку в русскоязычных странах более привычным к восприятию считается формат 11.07.2011 (день.месяц.год), то при выводе даты из базы данных, возникает необходимость в её преобразовании.

Преобразовать дату можно несколькими способами.

  1. при помощи php кода
  2. воспользовавшись командой DATE_FORMAT () при выборке из базы.

Первый способ применяется в тех случаях, когда необходимо вывести небольшое количество записей или же когда разработчик не подозревает о существовании второго способа.

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

Рассмотрим пример выполнения:

Допустим существует таблица message , которая содержит ячейку send_data с датой в формате 2011-07-11 .

Для извлечения и преобразования даты напишем следующий код:

Далее в том месте где необходимо вывести преобразованную дату, выводим массив $message любой, удобной для вас командой:

к примеру если в send_data находится 2011-05-03 то мы получим 03.05.2011 .

Номер индекса в массиве $message указываем каким по счету начиная от 0, в команде SELECT извлекается необходимое значение с преобразованной датой. К примеру при запросе:

вывод даты будет осуществляться с индексом 2:

Преобразовать дату при помощи DATE_FORMAT() можно в любой вид и очередность при помощи подстановки ключей.

Ниже приведен список основных элементов форматирования для даты и времени:

по умолчанию Oracle SQL developer отображает значения даты как 15-NOV-11 . Я хотел бы видеть часть времени (час/минута/секунда) по умолчанию.

есть ли способ настроить это в Oracle SQL Developer?

вы можете изменить это в настройках:

  1. из меню Oracle SQL Developer перейдите в:инструменты>настройки.
  2. С настройки выберите база данных>НЛС в левой панели.
  3. из списка параметров NLS введите DD-MON-RR HH24:MI:SS на Дата В Формате

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

    чтобы изменить формат отображения по умолчанию, я бы использовал шаги, предоставленные ousoo i.E Инструменты > Настройки > .

но много раз я просто хочу сохранить DEFAULT_FORMAT при изменении формата только во время кучки связанных запросов. Вот когда я бы изменил формат сеанса с помощью следующий:

alter SESSION set NLS_DATE_FORMAT = 'my_required_date_format'

с Oracle SQL Developer 3.2.20.09 мне удалось установить пользовательский формат для даты типа следующим образом:

In: Инструменты > Настройки > база данных > NLS

или: Outils > Préférences > Base de donées > NLS

Settings Menu screenshot

обратите внимание, что следующий формат не работает для меня :

Как a результат, он сохраняет формат по умолчанию, без каких-либо ошибок.

для тех, у кого все еще есть проблема с этим; я случайно нашел эту страницу из Google.

положите его в как это (параметры NLS). он прилипает ко мне в SQLDeveloper v3.0.04:

в моем случае формат, установленный в настройках / база данных/NLS was [формат даты] = RRRR-MM-DD HH24: MI: SSXFF но в сетке были замечены 8пробно default format RRRR / MM /DD (даже без времени) Формат изменился после изменения параметра [формат даты] на: RRRR-MM-DD HH24: MI: SS (без 'XFF' в конце).

ошибок не было, но формат с xff в конце не работал.

Примечание: в польской нотации RRRR означает YYYY

когда я скопировал формат даты для метки времени и использовал его для даты, это не сработало. Но изменение формата даты на это (DD-MON-YY HH12:MI:SS AM) сработало для меня.

изменение должно быть сделано в инструментах - > Настройки - > Поиск NLS

перейти к меню Инструменты > Настройки. В дереве выберите база данных > NLS. Доступны три формата даты / времени: Date, Timestamp и Timestamp TZ. Редактирование формата даты дает желаемый эффект.

Как я уже сказал выше, такой подход не дал мне постоянное изменение.

разработчик SQL версии 4.1.0.19

Шаг 1: Перейдите в меню Сервис - > Настройки

Шаг 2: Выберите база данных - > NLS

Шаг 3: перейдите в формат даты и введите DD-MON-RR HH24: MI: SS

Шаг 4: нажмите OK.

у меня есть связанная проблема, которую я решил и хотел, чтобы люди знали о моем решении. Используя SQL Developer, я экспортировал из одной базы данных в csv, а затем попытался импортировать ее в другую базу данных. Я продолжал получать ошибку в моих полях даты. Мои поля даты были в формате метки времени:

вышеуказанное решение (изменение настроек NLS) не работало для меня, когда я импортировал, но я, наконец, получил следующее:

По умолчанию разработчик Oracle SQL отображает значения даты как 15-NOV-11 . Я хотел бы видеть временную часть (час / минута / секунда) по умолчанию.

Есть ли способ настроить это в Oracle SQL Developer?

Вы можете изменить это в настройках:

  1. В меню Oracle SQL Developer выберите: Инструменты >Настройки .
  2. В диалоговом окне Параметры выберите База данных >NLS на левой панели.
  3. Из списка параметров NLS введите DD-MON-RR HH24:MI:SS в поле Формат даты .
  4. Сохраните и закройте диалог, готово!

Changing Date Format preferences in Oracle SQL Developer

У меня есть связанная проблема, которую я решил и хотел сообщить людям о своем решении. Используя SQL Developer, я экспортировал из одной базы данных в CSV, а затем попытался импортировать ее в другую базу данных. Я все время получал ошибку в полях даты. Мои поля даты были в формате отметки времени:

Вышеупомянутое решение (изменение предпочтений NLS) не сработало для меня при импорте, но, наконец, я получил следующее:

На экране определения столбца мастера импорта я ввел " DD-MON-RR HH.MI.SSXFF AM " в поле "Формат", и, наконец, он успешно импортирован. К сожалению, у меня есть десятки полей даты, и, насколько мне известно, нет возможности систематически применять этот формат ко всем полям даты, поэтому мне пришлось делать это вручную . вздох. Если кто знает способ получше, я был бы рад его услышать!

SQL Developer версии 4.1.0.19

Шаг 1. Перейдите в Инструменты -> Настройки.

Шаг 2: Выберите База данных -> NLS

Шаг 3: перейдите в формат даты и введите DD-MON-RR HH24: MI: SS

Шаг 4: Щелкните ОК.

Перейдите в Инструменты> Настройки. В дереве выберите База данных> NLS. Доступны три формата даты и времени: дата, отметка времени и отметка времени TZ. Редактирование формата даты дает желаемый эффект.

Как я уже сказал выше; этот подход не дал мне постоянных изменений.

Когда я скопировал формат даты для отметки времени и использовал его для даты, это не сработало. Но изменение формата даты на этот (DD-MON-YY HH12: MI: SS AM) сработало для меня.

Изменения необходимо внести в Инструменты-> Настройки-> поиск NLS.

Для тех, у кого все еще есть проблема с этим; Я случайно нашел эту страницу в гугле .

Поместите его так (параметры NLS) . он прилипает к мне в SQLDeveloper v3.0.04:

В моем случае формат, установленный в Preferences / Database / NLS, был [Date Format] = RRRR-MM-DD HH24: MI: SSXFF, но в сетке было видно 8, вероятно, формат по умолчанию RRRR / MM / DD (даже без времени). изменилось после изменения настройки [Формат даты] на: RRRR-MM-DD HH24: MI: SS (без «XFF» в конце).

Ошибок не было, но формат с xff в конце не работал.

Примечание: в польской записи RRRR означает YYYY.

С Oracle SQL Developer 3.2.20.09 мне удалось установить собственный формат для типа DATE следующим образом:

В: Инструменты> Настройки> База данных> NLS

Или: Outils> Preférences> Base de donées> NLS.

Settings Menu screenshot

Обратите внимание, что следующий формат у меня не работает :

В результате он сохраняет формат по умолчанию без каких-либо ошибок.

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

    Чтобы изменить формат отображения по умолчанию, я бы использовал шаги, предоставленные ousoo, то есть Инструменты> Настройки> .

Но часто я просто хочу сохранить DEFAULT_FORMAT, изменяя формат только во время кучи связанных запросов. Вот тогда я бы изменил формат сеанса следующим образом:

По умолчанию Oracle выводит даты в формате DD-MON-YY, где YY - две последние цифры года:

select sysdate from dual;


При вставке в таблицу значений типа date, по умолчанию можно использовать литерал в формате

DD-MON-YYYY
(две цифры номера дня, три буквы месяца и четыре цифры года)

или использовать ключевое слово DATE для передачи в базу литерала типа data в формате ANSI

YYYY-MM-DD
(четыре цифры года, две цифры месяца, две цифры номера дня)

insert into t1 (d) values ( DATE '1971-04-28');


Конвертация даты в строку:

select to_char(sysdate) from dual;


select to_char(sysdate, 'DD') from dual; -- день

select to_char(sysdate, 'MONTH') from dual; --месяц


select to_char(sysdate, 'YYYY') from dual; -- год


select to_char(sysdate, 'HH24:MI:SS') from dual; -- часы, минуты, секунды


select to_char(sysdate, 'DD MONTH YYYY HH24:MI:SS') from dual; -- комбинация параметров формата

02 ИЮЛЬ 2014 17:00:51


select to_char(sysdate, 'CC') from dual; -- двузначное столетие (век)

select to_char(sysdate - 1000000, 'SCC') from dual; -- двузначное столетие (век), со знаком минус до нашей эры


select to_char(sysdate, 'Q') from dual; -- однозначный квартал года


Немного о стандарте ISO.

В стандарте ISO, год, относящийся к номеру недели ISO, может отличаться от календарного года.

1 января 1988 года попадает на 53-ю неделю ISO для 1987 года.
Неделя всегда начинается с понедельника и заканчивается воскресеньем.

Как связан год с номером недели по стандарту ISO:

Если 1 января падает на пятницу, субботу или воскресенье, то неделя, включающая 1 января,
считается последней неделей предыдущего года, потому что большинство дней этой недели
принадлежат предыдущему году.

Если 1 января падает на понедельник, вторник, среду или четверг, то эта неделя считается
первой неделей нового года, потому что большинство дней этой недели принадлежат новому году.

1 января 1991 падает на вторник, поэтому неделя с понедельника, 31 декабря 1990 по воскресенье, 6 января 1991 считается неделей 1.

Чтобы получить номер недели ISO, используйте маску формата 'IW' для номера недели и одну из масок вида 'IY' для года.

select to_char( DATE '1991-01-01', 'YYYY WW') from dual; -- в обычном календарном формате

select to_char( DATE '1991-01-01', 'IYYY IW') from dual; -- в формате по ISO

в данном случае результаты совпадают.


Попробуем с другой датой:

Как видим результаты разные.


При вставке в таблицу даты, рекомендуется указывать все четыре цифры года.
Если указать только две последние цифры года, то две первые цифры (столетие)
Oracle будет интерпретировать в зависимости от того, какой формат был использован при вводе.
Если использовать формат YY, то в качестве столетия будет использовано текущее столетие,
которое в настоящее время установлено на сервере.

Неважно какой год мы указали, столетие всегда будет текущее (т.е. 20)


Если использовать формат YYYY но при этом указать только две последние цифры года
то в качестве столетия Oracle подставит нули (т.е. 00)


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

Если указанный год находится в интервале от 00 до 49 и текущий год тоже попадает в этот интервал,
то столетие будет текущим, но если при этом текуший год будет находится в интервале от 50 до 99,
то столетие при этом будет увеличено на 1 (текущее столетие + 1).

Если указанный год находится в интервале от 50 до 99 и текущий год тоже попадает в этот интервал,
то столетие будет текущим, но если при этом текуший год будет находится в интервале от 00 до 49,
то столетие при этом будет уменьшено на 1 (текущее столетие - 1).

Вобщем запомнить легко, если указанный год, больше текущего диапазона, значит столетие уменьшаем
и наоборот если указанный год, меньше текущего диапазона, значит столетие увеличиваем.


Интересно, а что будет если использовать формат RRRR, но при этом указать только две последние цифры года:

В качестве столетия Oracle не подставил нули, вывод аналогичен формату RR.


Для выделения первой цифры столетия в формате года можно использовать запятую:

select to_char(sysdate, 'Y,YYY') from dual; -- год с разделителем

Допустимые форматы года:

select to_char(sysdate, 'YYYY IYYY RRRR SYYYY Y,YYY YYY IYY YY IY RR Y I') from dual; -- год в различных форматах

2014 2014 2014 2014 2 014 014 014 14 14 14 4 4

А также год прописью:

select to_char(sysdate, 'YEAR') from dual; -- в верхнем регистре

select to_char(sysdate, 'Year') from dual; -- каждое слово с большой буквы

Форматы месяца:

select to_char(sysdate, 'MM') from dual; -- двузначный номер месяца


select to_char(sysdate, 'MONTH') from dual; -- полное название в верхнем регистре


select to_char(sysdate, 'Month') from dual; -- полное название с большой буквы


select to_char(sysdate, 'MON') from dual; -- три первые буквы в верхнем регистре


select to_char(sysdate, 'Mon') from dual; -- три первые буквы с большой буквы


select to_char(sysdate, 'RM') from dual; -- римскими цифрами

Форматы недели:

select to_char(sysdate, 'WW') from dual; -- двузначный номер недели года


select to_char(sysdate, 'IW') from dual; -- двузначный номер недели года по ISO


select to_char(sysdate, 'W') from dual; -- однозначный номер недели месяца

Форматы дня:

select to_char(sysdate, 'DDD') from dual; -- трехзначный номер дня года


select to_char(sysdate, 'DD') from dual; -- двузначный номер дня месяца


select to_char(sysdate, 'D') from dual; -- однозначный номер дня недели


select to_char(sysdate, 'DAY') from dual; -- полное название дня в верхнем регистре


select to_char(sysdate, 'Day') from dual; -- полное название дня с заглавной буквы


select to_char(sysdate, 'DY') from dual; -- первые две буквы названия в верхнем регистре


select to_char(sysdate, 'Dy') from dual; -- первые две буквы названия с заглавной буквы


select to_char(sysdate, 'J') from dual; -- Юлианский день - число дней, прошедшее с 1 января 4713 г. до нашей эры

Формат часов:

select to_char(sysdate, 'HH24') from dual; -- двузначный номер часа в 24 часовом формате


select to_char(sysdate, 'HH24 PM') from dual; -- с суффиксом


select to_char(sysdate, 'HH') from dual; -- двузначный номер часа в 12 часовом формате


select to_char(sysdate, 'HH PM') from dual; -- с суффиксом


select to_char(sysdate, 'HH A.M.') from dual; -- с суффиксом

Форматы минут:


select to_char(sysdate, 'MI') from dual; -- двузначное количество минут


Форматы секунд:


select to_char(sysdate, 'SS') from dual; -- двузначное количество секунд


Существует тип TIMESTAMP, который может хранить дробную часть секунд.
Необязательную точность представления секунд можно определить параметром FF[1..9]
Значение этого параметра по умолчанию равно 6 (справа от десятичной точки секунд можно поместить до 6 цифр)
При попытке поместить большее количество цифр в дробную часть секунд, значение дробной части будет округлено.

SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI.SS.FF') FROM dual; -- шесть цифр после десятичной точки (по умолчанию)

2014-10-18 08:55.42.050000


SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI.SS.FF3') FROM dual; -- три цифры после десятичной точки

2014-10-18 08:56.23.606


SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI.SS.FF9') FROM dual; -- девять цифр после десятичной точки

2014-10-18 08:56.55.526000000

select to_char(sysdate, 'SSSSS') from dual; -- число секунд отсчитываемое от полуночи


В отчетах statspack применяются следующие обозначения долей секунд:

second (s)
centisecond (cs) - 100th of a second
millisecond (ms) - 1,000th of a second
microsecond (us) - 1,000,000th of a second

Символы, позволяющие разделять аспекты дат и времени.
- / , . ; : или любой текст в кавычках "текст"


SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI.SS') FROM dual;

2014-10-18 14:30.43


SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD;HH24 "часов" MI "минут" SS "секунд"') FROM dual;

2014/10/18;14 часов 31 минут 18 секунд


AM или PM (A.M. или P.M.)

00:00 (полночь) 12:00 a.m.* (полночь)
12:00 (полдень) 12:00 p.m.* (полдень)

Проблемы в обозначениях полудня и полуночи:


SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI.SS AM') FROM dual;

2014-10-18 14:53.58 PM

AD или BC (A.D. или B.C.)

BC - до нашей эры


SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI.SS BC') FROM dual;

2014-10-18 15:00.25 Н.З.

TH - суффикс для чисел


SELECT TO_CHAR(SYSDATE, 'DDTH') FROM dual;


SELECT TO_CHAR(SYSDATE, 'ddTH') FROM dual;


SELECT TO_CHAR(SYSDATE, 'mmTH') FROM dual;


SELECT TO_CHAR(SYSDATE, 'YYYYTH') FROM dual;


SELECT TO_CHAR(SYSDATE, 'yyyyTH-MMTH-DDTH HH24TH:miTH.SSTH BC') FROM dual;

2014th-10TH-18TH 17TH:56th.52ND Н.З.


SP - числовые значения записываются словами

SELECT TO_CHAR(SYSDATE, 'DDSP') FROM dual;


SELECT TO_CHAR(SYSDATE, 'ddSP') FROM dual;


SELECT TO_CHAR(SYSDATE, 'mmTHSP') FROM dual;


SELECT TO_CHAR(SYSDATE, 'mmSP') FROM dual;


SELECT TO_CHAR(SYSDATE, 'YYYYTHSP') FROM dual;

TWO THOUSAND FOURTEENTH


SELECT TO_CHAR(SYSDATE, 'YYYYSP') FROM dual;

TWO THOUSAND FOURTEEN

EE - Полное название эпохи для японского календаря, календаря КНР и буддийского календаря.
E - Сокращенное название эпохи


select TO_DATE('H19-01-01' , 'EYY-MM-DD' , 'NLS_CALENDAR=''JAPANESE IMPERIAL''') e_date
from dual;


select TO_DATE('平成19-01-01' , 'EEYY-MM-DD' , 'NLS_CALENDAR=''JAPANESE IMPERIAL''') ee_date
from dual;


Часовые пояса:

В Oracle с версии 9i появилась возможность использовать различные часовые пояса.
Часовой пояс - это смещение от времени по Гринвичу(GMT).
Но теперь оно называется Всемирное скоординированное время(UTC).
Часовой пояс определяется либо как смещение относительно UTC, либо по имени региона (названию часового пояса).

Получить названия часовых поясов можно так:

select * from v$timezone_names;

Africa/Abidjan LMT
Africa/Abidjan GMT
Africa/Accra LMT
Africa/Accra GMT
Africa/Accra GHST
Africa/Addis_Ababa LMT
Africa/Addis_Ababa ADMT
Africa/Addis_Ababa EAT
Africa/Algiers LMT
Africa/Algiers PMT
Africa/Algiers WET
.

При определении смещения используется формат HH:MI с префиксом в виде знака + или -
+/- HH:MI


Посмотрим какое смещение относительно UTC установлено в нашей БД:

select dbtimezone from dual;

(меняется параметром time_zone в spfile.ora)

Часовой пояс сеанса можно определить так:

select sessiontimezone from dual;
Europe/Moscow


Его легко можно поменять на время сеанса:

alter session set time_zone = 'PST';
select sessiontimezone from dual;

Стандартное Тихоокеанское время PST отстает от UTC на восемь часов.
Восточное стандартное время EST отстает от UTC на пять часов.

Текущую дату для сеанса в локальном часовом поясе можно определить так:


select current_date from dual;


select to_char(current_date, 'YYYY-MM-DD HH24:MI.SS' ) from dual;

sysdate() - возвращает значение даты и времени, установленных в ОС компьютера, на котором размещена БД.
current_date() - возвращает значение даты и времени для часового пояса вашего сеанса.


Для любого часового пояса можно найти величину смещения с помощью функции tz_offset().

select tz_offset('PST') from dual;

select tz_offset('Europe/Moscow') from dual;


TZH - время в часах часового пояса
TZM - минуты часового пояса
TZR - регион часового пояса
TZD - часовой пояс с информацией о переходе на летнее время


Tип TIMESTAMP, в отличие от типа DATE, может хранить информацию о часовых поясах.

select to_char(SYSTIMESTAMP, 'TZH:TZM') from dual;


select to_char(SYSTIMESTAMP, 'TZR') from dual;


select to_char(SYSTIMESTAMP, 'TZD') from dual;


select to_char(SYSTIMESTAMP, 'HH:MI:SS.FFTZH:TZM') from dual;


select to_char(SYSTIMESTAMP, 'YYYY-MM-DD HH:MI:SS TZH:TZM') from dual;

2014-10-18 10:52:19 +04:00


select to_char(SYSTIMESTAMP, 'YYYY-MM-DD HH:MI:SS.FF AM TZH:TZM TZR TZD') from dual;

2014-10-18 10:52:31.802000 PM +04:00 +04:00


Чтобы конвертировать дату-время из одного часового пояса к другому,
можно воспользоваться функцией NEW_TIME().


Конвертация строки в тип дата-время.


Функцию TO_DATE(x [, формат])
можно использовать для конвертирования строки x в тип дата-время.

Если строка формата опущена, то дата должна быть представлена в формате по умолчанию:

DD-MON-YYYY или DD-MON-YY

(Вообще формат даты по умолчанию определяет параметр БД NLS_DATE_FORMAT)

alter session set NLS_DATE_LANGUAGE = 'AMERICAN' ;
alter session set NLS_DATE_FORMAT = 'SYYYY-MM-DD' ;
alter session set NLS_TIMESTAMP_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' ;
alter session set NLS_TIMESTAMP_TZ_FORMAT = 'SYYYY-MM-DD HH24:MI:SS TZH:TZM' ;


Можно и явно задать формат

select to_date('April 28, 1971' , 'MONTH DD, YYYY') from dual;


Совместное использование to_date() и to_char()


Формат даты по умолчанию, можно использовать и при вставке строк в таблицу:

alter session set NLS_DATE_FORMAT = 'DD-MON-YYYY';

NLS - параметры:

National language_support (До Oracle9i)
Globalisation support (Начиная с Oracle9i)


Кодировка устанавливается только в переменных окружения!

Язык - RUSSIAN, AMERICAN

SELECT * FROM v$nls_valid_values
WHERE parameter = 'LANGUAGE'
ORDER BY value

CIS - СНГ
1. первый день недели
2. символ национальной валюты
(Если явно не задан параметр NLS_CURRENCY)
3. Десятичный и групповой разделители чисел

SELECT * FROM v$nls_valid_values
WHERE parameter = 'TERRITORY'
ORDER BY value

SELECT * FROM v$nls_valid_values
WHERE parameter = 'CHARACTERSET'
-- Русский язык, Кириллица
AND (value LIKE 'CL%'
OR
value LIKE 'RU%')
ORDER BY value

WE8ISO8859P1 - Западная Европа

Какие есть параметры NLS?

SELECT * FROM nls_session_parameters

PARAMETER VALUE
================ ==========
NLS_LANGUAGE=AMERICAN
NLS_TERRITORY=CIS
-- Символ нац. валюты
NLS_CURRENCY='р.'
-- Символ нац. валюты по стандарту ISO
NLS_ISO_CURRENCY='CIS'
-- Десятичный разделитель и разделитель групп
NLS_NUMERIC_CHARACTERS=', '
-- Календарь
NLS_CALENDAR=GREGORIAN
-- Формат ввода и вывода даты по-умолчанию
NLS_DATE_FORMAT='DD.MM.RR'
-- Язык для вывода названий месяцев и дней недели
NLS_DATE_LANGUAGE='AMERICAN'
-- Тип Сортировки
NLS_SORT=BINARY
-- . (нет описания)
NLS_TIME_FORMAT='HH24:MI:SSXFF'
-- Формат ввода и вывода даты типа TIMESTAMP по-умолчанию
NLS_TIMESTAMP_FORMAT='DD.MM.RR HH24:MI:SSXFF'
-- . (нет описания)
NLS_TIME_TZ_FORMAT='HH24:MI:SSXFF TZR'
-- Формат ввода и вывода даты типа TIMESTAMP с временнОй зоной по-умолчанию
NLS_TIMESTAMP_TZ_FORMAT='DD.MM.RR HH24:MI:SSXFF TZR'
-- Замещает символ нац. валюты, установленный по умолчанию параметром NLS_TERRITORY
NLS_DUAL_CURRENCY='р.'
-- Как сравнивать строки BINARY или ASCII (по правилам нац. алфавита)
NLS_COMP=BINARY
-- CHAR по умолчанию в байтах или в символах
NLS_LENGTH_SEMANTICS=BYTE
-- NLS_NCHAR_CONV_EXCP determines whether an error is reported when there is
-- data loss during an implicit OR explicit CHARACTER TYPE conversion.
-- The DEFAULT value results IN no error being reported.
NLS_NCHAR_CONV_EXCP=FALSE


Как можно устанавливать значения параметров NLS?

1. В системном реестре Windows

2. Установить переменные окружения
Для Windows (в bat-файле)

SET NLS_DATE_LANGUAGE=RUSSIAN
SET NLS_LANG=AMERICAN_CIS.CL8MSWIN1251
sqlplus .

3. ALTER SESSION SET
NLS_DATE_LANGUAGE=RUSSIAN
NLS_DATE_FORMAT='DD.MM.YYYY';

SELECT TO_CHAR(SYSDATE, 'Month day')
FROM dual


Посмотреть nls-параметры сессии, базы данных и инстанса можно так:

select * from
(select 'SESSION' SCOPE,s.* from nls_session_parameters s
union
select 'DATABASE' SCOPE,d.* from nls_database_parameters d
union
select 'INSTANCE' SCOPE,i.* from nls_instance_parameters i
) a
pivot (LISTAGG(VALUE) WITHIN GROUP (ORDER BY SCOPE)
FOR SCOPE
in ('SESSION' as "SESSION",'DATABASE' as "DATABASE",'INSTANCE' as "INSTANCE"));


Функции для работы с типом data.

ADD_MONTHS(data, n)
Позволяет добавить к дате целое количество месяцев (или отнять, если n отрицательное)

SELECT ADD_MONTHS('28.04.1971' , 13) FROM DUAL; -- Добавить 13 месяцев

SELECT ADD_MONTHS('28.04.1971' , -12) FROM DUAL; -- Отнять 12 месяцев

Читайте также: