Oracle дата в формате iso 8601
какой самый элегантный способ сделать ISO 8601 форматированное представление текущего момента, UTC? Это должно выглядеть так: 2010-10-12T08:50Z .
использовать SimpleDateFormat в любой формат Date объект:
С помощью new Date() как показано выше, формат текущего времени.
для систем, где часовой пояс по умолчанию не UTC:
The SimpleDateFormat экземпляр может быть объявлен как глобальная константа, если это необходимо часто, но помните, что этот класс не является потокобезопасным. Он должен быть синхронизирован, если к нему одновременно обращаются несколько потоков.
EDIT: я бы предпочел время Joda, если делать много разных манипуляций с временем/датой.
EDIT2: исправлена: setTimeZone не принимает строку (исправлено Павлом)
Java 8:
Pre Java 8:
С документы:
'R' время, отформатированное для 24-часовых часов как "%tH:%tM"
'F' ISO 8601 полная дата в формате "%tY - %tm - %td".
java.время делает его простым с Java 8. И потокобезопасно.
результат: 2015-04-14T11:07:36.639Z
у вас может возникнуть соблазн использовать зажигалку Temporal например Instant или LocalDateTime , но им не хватает поддержки форматирования или данных о часовых поясах. Только ZonedDateTime работает из коробки.
путем настройки или цепочки параметров / операций ZonedDateTime и DateTimeFormatter, вы можете легко контролировать часовой пояс и точность в определенной степени:
уточненные требования, такие как удаление части секунд, должны по-прежнему обслуживаться пользовательскими форматами или пользовательским почтовым процессом.
для Java 6 & 7, Вы можете рассмотреть обратные порты java.время, например ThreeTen-Backport, который также имеет порт Android. Оба легче, чем Джода, и учился у Джоды опыт - esp. учитывая, что Java.время разработано автором Джоды.
использовать JodaTime
календарная система ISO 8601 является реализацией по умолчанию в Joda-Time
здесь это документ для Jodatime Formatter
Если вы не хотите добавлять или если вы не видите значение добавления выше библиотеки вы можете просто использовать в built SimpleDateFormat класс для форматирования даты в требуемый формат ISO
как предложил @Joachim Sauer
начиная с Java 8 вы можете просто сделать:
С java.time.Instant документы:
теперьpublic static Instant now()
получает текущий момент времени от системных часов.
это будет запрос системные часы UTC для получения текущего момента времени.
toStringpublic String toString()
строку представление этого момента с использованием представления ISO-8601.
используемый формат совпадает с DateTimeFormatter.ISO_INSTANT .
DateFormatUtils от Apache commons-lang3 полезные константы, например: DateFormatUtils.ISO_DATETIME_FORMAT
Если вы не хотите включать Jodatime (как хорошо, как это)
который возвращает строку:
который немного отличается от исходного запроса, но по-прежнему ISO-8601.
обновление: The Joda Времени сейчас режим обслуживания, С командой, консультирующей миграцию в java.время классы. Для Java 6 & 7 см. ThreeTen-Backport проект, дополнительно адаптированный для Android в ThreeTenABP.
С помощью Joda Времени библиотека.
это потокобезопасными. Джода-время создает новое неизменяемые объекты вместо изменения существующих объектов.
если вы действительно намеревались попросить формат без секунд, разрешая до минут, то используйте один из многих других встроенных форматеров в Joda-Time.
для Java 8 и более поздних версий Joda-Time продолжает работать. Но встроенный java.время основы вытесняет Джода-Время. Поэтому перенесите свой код с Joda-Time на java.время, как только это удобно.
посмотреть мой другой ответ для современного решения.
- Java SE 8,Java SE 9,Java SE 10, а позже
- встроенный.
- часть стандартного Java API в комплекте реализация.
- Java 9 добавляет некоторые незначительные функции и исправления.
- большая часть java.функциональность time обратно портирована на Java 6 & 7 в ThreeTen-Backport.
-
версии Android bundle реализации java.время занятий.
вы можете использовать Java SimpleDateFormat со следующим рисунком yyyy-MM-dd'T'HH:mm:ssXXX Для ISO 8601.
Пример Кода: (перечисляет все доступные часовые пояса)
вы могли бы использовать:
для виртуальной машины по умолчанию часовой пояс. Еще здесь
вы можете заметить дату время для нескольких часовых поясов, которые заканчиваются с 'Z' . Эти часовые пояса имеют смещение '0' от GMT.
более подробную информацию можно найти здесь.
Я считаю, что самый простой способ-сначала перейти к instant, а затем к строке типа:
что приведет к:
2017-09-08T12:56:45.331Z
вот целый класс оптимизирован так, что вызов "now()" не делает ничего больше, что он должен делать.
тем не менее, joda-time поддерживает только расширенный формат: "2015-12-09T00:22: 42.930 Z" не основное: "20151209T002242.930Z" . возможно, нам лучше протестировать список форматов с помощью java SimpleDateFormat.
Я сделал это в Android с помощью календаря и SimpleDateFormat. Следующий метод возвращает календарь с часовым поясом " GMT " (это универсальный часовой пояс). Затем вы можете использовать класс Calendar для установки часа между различными часовыми поясами, используя метод setTimeZone() класса Calendar.
запомнить: Класс Date не знает о существовании часовых поясов. По этой причине, если вы отлаживаете одну дату,вы всегда видите дату для вашего текущего часового пояса.
The jav.time.Instant класс представляет момент в UTC, всегда в UTC.
в Z в конце строки вашего примера 2010-10-12T08:50Z произносится как "Зулу" и означает UTC.
ваш желаемый формат соответствует ISO 8601 стандартные. Элемент java.время классы используют эти стандартные форматы по умолчанию при разборе / генерации строк. Поэтому нет необходимости указывать шаблон форматирования. Просто позвоните Instant::toString как видно выше.
если вы специально хотите целые минуты без второго или дробная секунда, затем усечение. Укажите единицу времени через ChronoUnit класса.
The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date , Calendar ,& SimpleDateFormat .
чтобы узнать больше, смотрите Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.
вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте - драйвера совместимый с JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в java.sql.* классы.
где получить java.время занятий?
- Java SE 8,Java SE 9,Java SE 10, и позже
- встроенный.
- часть стандартного Java API с комплектной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- большая часть java.функциональность time обратно портирована на Java 6 & 7 в ThreeTen-Backport.
- более поздние версии Android bundle реализации Ява.время занятий.
- для более ранних Android (ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). Смотрите как использовать ThreeTenABP..
The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к Ява.время. Вы можете найти некоторые полезные классы, такие как Interval , YearWeek , YearQuarter и больше.
По умолчанию 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 valueCIS - СНГ
1. первый день недели
2. символ национальной валюты
(Если явно не задан параметр NLS_CURRENCY)
3. Десятичный и групповой разделители чиселSELECT * FROM v$nls_valid_values
WHERE parameter = 'TERRITORY'
ORDER BY valueSELECT * FROM v$nls_valid_values
WHERE parameter = 'CHARACTERSET'
-- Русский язык, Кириллица
AND (value LIKE 'CL%'
OR
value LIKE 'RU%')
ORDER BY valueWE8ISO8859P1 - Западная Европа
Какие есть параметры 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 месяцев
Строка с форматом хранится и на клиентском компьютере и на сервере.
NLS_TERRITORY - задает правила преобразования для ввода чисел, дат.
В системе Windows параметр надо смотреть в реестре.
Значение (например, у меня):
Если вы хотите все настроить по-русски, то установите параметр:
Формат даты будет "DD.MM.YY".Помимо пользовательских настроек хранения формата существуют также и серверные. Посмотреть их можно следующим запросом:
Обратите внимание на параметр NLS_DATE_FORMAT. Он выставляется в зависимости от параметра NLS_TERRITORY. Изменяя значение NLS_TERRITORY, вы тем самым меняете NLS_DATE_FORMAT. А вот обратное не верно.
Параметр NLS_DATE_LANGUAGE зависит от NLS_LANGUAGE и их зависимости аналогичны представленным выше.
Вы, наверное, уже понимаете, что формат даты на сервере может отличаться от настроек на вашем клиентском рабочем месте. В этом случае некорректно написанная процедура, запущенная в клиентской сессии может обрабатывать даты без ошибок, а при запуске на сервере с помощью механизма оракловых заданий может выдавать ошибки.
Иногда полезно сравнить настройки базы с параметрами вашей сессии:
Как избежать ошибок, связанных с настройками формата даты?Существуют несколько способов избежать ошибок, возникающих из-за различий в настройках формата даты пользователя и самой базы данных.
Во-первых вы можете использовать неявное преобразование.
Контролируйте (требуйте) правильной конфигурации сервера и рабочих мест. Пропишите нужные вам настройки в руководстве администратора и подобных ему документах.Если вы решили использовать этот метод, то можете подстелить себе соломку. В начале каждой сессии выполняйте команду:
Или сразу устанавливайте параметр NLS_TERRITORY:
Для несерьезных приложений и маленьких систем этот метод вполне подходит, но он имеет недостатки. Например, не всем пользователям может понравиться ващ формат ввода дат, особенно если он отличается от настроек в операционной системы. А пользователи обычно "бузят", когда им неудобно.
Следующий способ - использовать функцию явного преобразования символьной строки в значение типа DATE. Формат ее очень прост: TO_DATE(строка с датой, строка с форматом).
Пользоваться функцией очень просто. Вставляйте её во всех местах, где вам нужно использовать константу с датой.
Строка с форматом допускает использование порядка 24 масок. Их полный перечень и подробное описание можно найти в документации. В приложении к этой статье есть памятка с наиболее ходовыми масками.
Через некоторое время вы изучите и запомните все основные форматы. И ещё.
. вы обнаружите некоторые недостатки "безудержного" применения TO_DATE.
Один из недостатков: неудобно использовать громоздкую запись. Другой: из-за череды механических преобразований запросы теряют свою лаконичность.
Кроме того, учтите - вставляя функцию TO_DATE в запросы и явно указывая в ней формат, вы либо осознанно жестко зашиваете строку с форматом в код приложения, либо вы готовы написать дополнительный код по выбору нужного формата в зависимости от каких-то условий.Оба подхода имеют право на существование. Не будет рассуждать, какой из них лучше. Давайте рассмотрим третий способ преобразования.
Для того чтобы подставить значение даты в нужное место запроса, можно использовать механизм BIND-переменных.
BIND-переменные используютсядля подстановки значений в нужные места запроса. Обычно, для обозначения мест применяются маркеры с символом двоеточия. Например:
При использовании BIND-переменных за преобразование строк с датами в значение DATE отвечает приложение. Вернее сказать, инструментальное средство. Вся суета с преобразование и ответственность за его результат перекладывается с программиста на инструментальное средство.
Хотите узнать подробности? Сейчас расскажу, но прежде давайте представим, что для написание клиентской части вы выбрали какое-нибудь высокоуровневое средство разработки. Пусть это средство поддерживает язык программирования. Язык позволяет работать с данными разных типов. Для работы с датами в нем предусмотрен свой тип. Машинное представление дат в этом средстве разработки будет отличаться от ораклового. Правила обработки тоже будут другими.
А теперь смотрите, что происходит. Вы объявляете в программе для работы с датой переменную нужного типа. Присваиваете ей значение, константу или строку, которую ввел пользователь. Затем передаете значение переменной в запрос с помощью BIND-переменной.
Расскажу подробнее. Первый этап: вы в программе присваиваете переменной значение. По сути это операция преборазования строки с датой в значение нужного типа. У средства разработки клиентских приложений есть большой арсенал сделать эту операцию легко и без проблем.
Иногда даже само присваивание происходит неявно. Вы создаете экранную форму с полем ввода даты, пользователь вводит строку с датой, а вы затем считываете в переменную не строку, а значение, уже преобразованное в нужный тип.
Второй этап: передача значения переменной в запрос.
Как видите, программист не работает напрямую с оракловым типом DATE. Все хлопоты по передаче даты в запрос переложены на систему разработки.
формат даты Oracle по умолчанию-гггг-ММ-ДД. Что означает, если я это сделаю:
. Я!--5-->теряет часть времени моего дня.
а если серьезно, почему не является ли выше значение по умолчанию? Особенно в СУБД, где два основных типа данных отслеживания времени (дата и метка времени) и имеют компонент времени, который включает (по крайней мере) точность до 1 секунды.
Если вы используете этот запрос для создания входного файла для хранилища данных, вам необходимо соответствующим образом отформатировать данные. По сути, в этом случае вы конвертируете дату (которая имеет компонент времени) в строку. Вам нужно явно отформатировать строку или изменить nls_date_format, чтобы установить значение по умолчанию. В вашем запросе вы можете просто сделать:
вы уверены, что не путаете Oracle database с Oracle SQL Developer?
сама база данных имеет формат даты, дату из базы данных в необработанном виде. Это зависит от клиентского программного обеспечения для его визуализации и SQL Developer тут используйте YYYY-MM-DD в качестве формата по умолчанию, который почти бесполезен, я согласен.
edit: как было прокомментировано ниже, SQL Developer можно перенастроить для правильного отображения значений даты, у него просто плохие значения по умолчанию.
формат гггг-ММ-ДД является частью в формате iso8601 стандарт для обмена информацией о дате (и времени).
Это очень храбро Oracle, чтобы принять ISO стандартный такой, но в то же время, странно, что они не идти.
В общем люди сопротивляются чему-либо другому, но их много хороший Международный причины для него.
Я знаю, что говорю революционный вещи, но мы все должны принять стандарты ISO, даже если мы это делаем немного за раз.
самая большая Пита Oracle - это то, что не имеет формата даты по умолчанию!
в вашей установке Oracle выбрано сочетание локалей и опций установки (очень разумно!) Гггг-ММ-ДД как формат для вывода дат. Другая установка могла выбрать "DD/MM/YYYY" или "YYYY/DD / MM".
Если вы хотите, чтобы ваш SQL был переносим на другой сайт Oracle, я бы рекомендовал вам всегда обертывание TO_CHAR(datecol,'YYYY-MM-DD') или подобная функция вокруг каждого столбец даты ваш SQL или альтернативно установить формат defualt сразу после подключения с
никогда не разумно полагаться на то, что по умолчанию установлено определенное значение, IMHO, будь то форматы дат, форматы валют, режимы оптимизатора или что-то еще. Вы всегда должны устанавливать необходимое значение формата даты на сервере, клиенте или в приложении.
в частности, никогда не полагайтесь на значения по умолчанию при преобразовании даты или числовых типов данных для целей отображения, потому что одно изменение в базе данных может сломать ваше приложение. Всегда используйте явное преобразование формат. В течение многих лет я работал над системами Oracle, где формат отображения даты по умолчанию был MM/DD/RR, что сводило меня с ума, но, по крайней мере, заставляло меня всегда использовать явное преобразование.
большинство IDE вы можете настроить маску по умолчанию для некоторых данных как дата, валюта, десятичный разделитель и т. д.
Если вы используете Oracle SQL Developer:
инструмент > настройки > база данных > NLS
формат даты: гггг-ММ-ДД HH24: MI: SS
Это "проблема"на стороне клиента, а не проблема Oracle.
Это клиентское приложение, которое форматирует и отображает дату этого пути.
в вашем случае это SQL * Plus, который делает это форматирование.
Другие клиенты SQL имеют другие значения по умолчанию.значением даты для стандарта SQL является гггг-ММ-ДД. Поэтому, хотя Oracle хранит информацию о времени, я предполагаю, что они отображают значение таким образом, который совместим со стандартом SQL. В стандарте есть тип данных TIMESTAMP, который включает информацию о дате и времени.
Я не Пользователь Oracle (ну, в последнее время во всяком случае), но.
в большинстве баз данных (и на точном языке) дата не включает время. Наличие даты не означает, что вы обозначаете определенную секунду на эту дату. Обычно, если вы хотите время, а также дату, это называется меткой времени.
Oracle имеет типы данных даты и метки времени.
по данным документация Oracle, существуют различия в размере данных между датой и меткой времени, поэтому, когда намерение состоит в том, чтобы иметь только поле даты, имеет смысл показать форматирование даты. Кроме того, "у него нет дробных секунд или часового пояса."- это не лучший выбор, когда требуется информация метка времени.
поле даты можно легко отформатировать, чтобы показать время компонент в Oracle SQL Developer -запрос даты выполняется в PL / SQL Developer показывает время, но не отображается в Oracle SQL Developer. Но он не будет показывать дробные секунды или часовой пояс - для этого вам нужен тип данных Timestamp.
причина: если вы смотрите на столбец данных со штампом времени, бит _MOST_IMPORTANT_ - это год. Если данные в БД в течение десяти лет, это важно знать. Итак, год на первом месте.
имеет смысл, что месяц наступит следующим, затем день, час, минута. Объективно, это наиболее логичная последовательность для отображения временных данных.
также имеет смысл, что если вы собираетесь отображать данные по умолчанию, вы должны отображать только самая значительная часть данных, поэтому по умолчанию отображается только Y-M-D. Все остальное может отображаться, но по умолчанию это не загромождает ваш отчет sql.
упорядочение по дате логично, если вы отображаете Y-M-D, потому что оно последовательное. Компьютеры хороши в последовательности, и это выглядит логично.
наконец-то. Ваше пристрастие хотеть M-D-Y-это ваше пристрастие. Не все даже в США используют этот формат. Поэтому используйте самый логичный формат и не возмущайтесь, когда другие решат быть логичным по умолчанию.
(Я рожден нами, и я не представляю Oracle. Я могу, однако, думать за себя)
чтобы ответить на ваш вопрос, поэтому дата по умолчанию не отображает часть времени, единственный ответ, который я нахожу, -
Oracle команды состоят из ленивых разработчиков или ответственных: -)
потому что дата, время и datetime типы данных существуют в SQL и Oracle еще не реализовал его .
Это позор для Oracle.
но правильный ответ на вашу проблему-не определить формат исправления по умолчанию, а Значимый формат по умолчанию, который отображает только значимые цифры, чтобы отображаемые значения даты, времени или времени (по умолчанию) всегда содержали все важные цифры.
все цифры, являющиеся частью даты, всегда будут отображаться как целочисленная часть числа float. Для части времени только значительная часть будет отображаться как для десятичной части в номере float. Естественно, для типа времени (только HH: MM: SS), часть даты никогда не показывается.
Читайте также: