Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Oracle Tutorial.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
422.4 Кб
Скачать

Функции по работе с датами.

Под датой будем понимать дату со временем.

Текущая дата на сервере - sysdate. Даты можно задавать в формате с маской, например:

select sysdate,

to_date('31.01.2012 22:56:17', 'dd.mm.yyyy hh24:mi:ss'),

to_date('2012-03-08', 'yyyy-mm-dd')

from dual;

Даты можно вычитать, в результате выйдет число, равное количеству дней между датами.

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

Даты нельзя складывать, умножать и делить.

Продемонстрируем операции над датами:

select sysdate + 1, /* текущая дата + 1 день */

sysdate - 1.5, /* текущая дата - 1.5 дня */

sysdate + 1 / 24 / 60, /* текущая дата + 1 минута */

dt, /* dt из подзапроса */

sysdate - dt, /* разность sysdate и dt в днях */

trunc(sysdate), /* округлили sysdate до целых дней, отбросив часы, минуты и секунды */

trunc(dt, 'yyyy'), /* взятие первого дня года, к которому относится dt */

trunc(dt, 'mm'), /* взятие первого дня месяца, к которому относится dt */

trunc(dt, 'dd'), /* округление dt до дней */

trunc(sysdate, 'iw'), /* взятие первого дня недели, к которому относится dt */

to_char(sysdate, 'iw'), /* номер недели в году по мнению Oracle */

to_char(dt, 'WW'), /* номер недели в году, причем первой неделей считаются первые семь дней с начала года */

to_char(sysdate, 'w'), /* номер недели в месяце по мнению Oracle */

to_char(sysdate, 'd'), /* номер дня недели (зависит от NLS_TERRITORY) */

to_char(sysdate, 'DY'), /* название дня недели (зависит от NLS_DATE_LANGUAGE) */

to_char(sysdate, 'DAY'), /* полное название дня недели (зависит от NLS_DATE_LANGUAGE) */

to_char(sysdate, 'MON'), /* название месяца (зависит от NLS_DATE_LANGUAGE) */

to_char(sysdate, 'MONTH'), /* полное название месяца (зависит от NLS_DATE_LANGUAGE) */

to_char(dt, 'yyyy/mm/dd'), /* приведение даты к строковому типу согласно заданной маске */

to_char(dt, 'dd-mon-yyyy', 'NLS_DATE_LANGUAGE=''AMERICAN'''), /* приведение даты к строковому типу согласно заданной маске по-американски */

to_char(dt, 'dd-mon-yyyy', 'NLS_DATE_LANGUAGE=''RUSSIAN'''), /* приведение даты к строковому типу согласно заданной маске по-русски */

to_char(dt), /* без маски зависит от NLS_DATE_FORMAT */

to_char(to_date('27-oct-98',

'dd-mon-rr',

'NLS_DATE_LANGUAGE=''AMERICAN'''),

'yyyy'), /* mon - это еще один формат месяца, rr - формат года, отнесение которого в какому-либо веку доверяешь Oracle */

to_char(to_date('27-jan-17',

'dd-mon-rr',

'NLS_DATE_LANGUAGE=''AMERICAN'''),

'yyyy'), /* 98 - 1998 год, 17 - 2017 год */

to_char(sysdate, 'yy'), /* последние 2 цифры года */

add_months(dt, 1), /* добавление к дате 1 месяца (по мнению Oracle) */

add_months(dt, -1.5), /* если второй параметр не целый, Oracle его округляет */

months_between(to_date('30.11.2012', 'dd.mm.yyyy'),

to_date('31.01.2012', 'dd.mm.yyyy')) /* количество месяцев между датами (по мнению Oracle) */,

months_between(to_date('29.02.2012', 'dd.mm.yyyy'),

to_date('28.01.2012', 'dd.mm.yyyy')) /* еще одно количество месяцев между датами (по мнению Oracle) */,

extract(year from sysdate) /* выделили год из sysdate */,

extract(month from sysdate) /* выделили год из sysdate */,

extract(day from sysdate) /* выделили день из sysdate */

from (select to_date('03.02.2012 22:56:17', 'dd.mm.yyyy hh24:mi:ss') dt

from dual);

Предлагается выполнить этот запрос с различными настройками сессии и всмотреться в различия:

Вариант 1:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

ALTER SESSION SET NLS_TERRITORY = 'AMERICA';

ALTER SESSION SET NLS_DATE_LANGUAGE = 'AMERICAN';

Вариант 2:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YYYY';

ALTER SESSION SET NLS_TERRITORY = 'CIS';

ALTER SESSION SET NLS_DATE_LANGUAGE = 'RUSSIAN';

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

dt := to_date('24.12.2012', 'DD.MM.YYYY')

вместо варианта

dt := '24.12.2012'

, который не всегда работает.

Также NLS-настройки, действующие по умолчанию, можно прописывать на уровне базы, в переменных среды windows и в реестре.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]