Примеры работы с датами в Oracle


Преобразовать строку в дату

Блин, что же может быть проще?
Почему я все время забываю эту команду.

select TO_DATE('16/10/2016', 'dd/mm/yyyy') from dual;


Вычисления текущего дня, месяца и т.д. с помощью SQL

(Исправления/Уточнения/Добавления принимаются)


Текущая неделя

-- Сегодня
select trunc (SYSDATE) from dual;


-- Вчера
select trunc (SYSDATE-1) from dual;


-- Завтра
select trunc (SYSDATE+1) from dual;


-- Первый день недели
select trunc(SYSDATE, 'DAY') from dual;
-- Output: 30.05.2016


-- Последний день недели
select trunc(SYSDATE, 'DAY')+6 from dual;
-- Output: 05.06.2016


Прошедшая неделя

-- Первый день прошедшей недели
select trunc(SYSDATE, 'DAY') -7 from dual;
-- Output: 23.05.2016


-- Последний день прошедшей недели
select trunc(SYSDATE, 'DAY')-1 from dual;
-- Output: 29.05.2016


Следующая неделя

-- Первый день следующей недели
select trunc(SYSDATE, 'DAY') +7 from dual;
-- Output: 06.06.2016


-- Последний день следующей недели
select trunc(SYSDATE, 'DAY') +13 from dual;
-- Output: 12.06.2016


Текущий месяц

-- Первый день месяца
select trunc (SYSDATE, 'MM') from dual;


-- Последний день месяца
select trunc (last_day(sysdate)) from dual;


Прошедший месяц

-- Первый день прошлого месяца
select trunc(ADD_MONTHS(SYSDATE, -1), 'MM') from dual;


-- Последний день прошлого месяца
select trunc (SYSDATE, 'MM') -1 from dual;


Следующий месяц

-- Первый день следующего месяца
select trunc (last_day(sysdate)) +1 from dual;


-- Последний день следующего месяца
select trunc(LAST_DAY(ADD_MONTHS(SYSDATE, 1))) from dual;


Текущий квартал

-- Первый день квартала
select trunc (SYSDATE, 'Q') from dual;

-- Последний день квартала
select add_months(trunc(sysdate,'q'),3)-1 from dual;


Прошлый квартал

-- Первый день прошлого квартала
select trunc(add_months(sysdate,-3),'q') from dual;

-- Последний день прошлого квартала
select add_months(trunc(add_months(sysdate,-3),'q'),3)-1 from dual;


Следующий квартал

-- Первый день следующего квартала
select add_months(trunc(sysdate,'q'),3) from dual;

-- Последний день следующего квартала
select add_months(trunc(add_months(sysdate,3),'q'),3)-1 from dual;


Текущий год

-- Первый день года
select trunc (SYSDATE, 'Y') from dual;

-- Последний день года
select ADD_MONTHS(trunc (SYSDATE, 'YEAR'),12)-1 FROM DUAL;


Прошедший год

-- Первый день прошлого года
select ADD_MONTHS (trunc (SYSDATE, 'YEAR'), -12) FROM DUAL;


-- Последний день прошлого года
select ADD_MONTHS (trunc (SYSDATE, 'YEAR'), -1 ) +30 FROM DUAL;


Следующий год

-- Первый день следующего года
select ADD_MONTHS(trunc (SYSDATE, 'YEAR'),12) FROM DUAL;

-- Последний день следующего года
select ADD_MONTHS(trunc (SYSDATE, 'YEAR'),24)-1 FROM DUAL;



Нужно будет упростить вычисления, если это возможно.
Я писал на лету и сам эти вычисления не использую. Т.е. допускаю, что где-то закралась ошибка. Если что, поправлю.