Функция DATEADD
Функция DATEADD (datepart, number, date) возвращает значение типа datetime, которое получается добавлением к дате date количества интервалов типа datepart, равного number (целое число).
Например, мы можем к заданной дате добавить любое число лет, дней, часов, минут и т.д.
Допустимые значения аргумента datepart приведены ниже в таблице и взяты из электронной документации к SQL Server — Books On Line (BOL).
Datepart | Допустимые сокращения |
---|---|
Year — год | yy, yyyy |
Quarter — квартал | qq, q |
Month — месяц | mm, m |
Dayofyear — день года | dy, y |
Day — день | dd, d |
Week — неделя | wk, ww |
Hour — час | hh |
Minute — минута | mi, n |
Second — секунда | ss, s |
Millisecond - миллисекунда | ms |
Пусть сегодня 28.10.2005, и мы хотим узнать, какой день будет через неделю. Мы можем написать:
SELECT DATEADD(day, 7, current_timestamp);
[[ column ]] |
---|
[[ value ]] |
а можем и так:
SELECT DATEADD(ww, 1, current_timestamp);
[[ column ]] |
---|
[[ value ]] |
В результате получим одно и то же значение; что-то типа 2005-11-04 00:11:28.683.
Однако мы не можем в этом случае написать:
SELECT DATEADD(mm, 1/4, current_timestamp);
[[ column ]] |
---|
[[ value ]] |
и не потому, что четверть месяца не равна в точности неделе, а потому, что дробная часть значения аргумента datepart отбрасывается (целочисленное деление), и мы получим 0 вместо одной четвертой и, как следствие, текущий день.
Кроме того, мы можем использовать вместо CURRENT_TIMESTAMP функцию T-SQL GETDATE() с тем же самым эффектом. Наличие двух идентичных функций поддерживается, видимо, в ожидании последующего развития стандарта.
Пример 7.1.1
Замечание
В примерах данной главы используется база данных «Аэрофлот». Описание этой схемы и всех остальных схем, используемых в настоящее время на сайте для решения задач, можно найти в Приложении 1.
SELECT DATEADD(day, 7, (SELECT MAX(date) max_date
FROM pass_in_trip
)
);
[[ column ]] |
---|
[[ value ]] |
Применение подзапроса в качестве аргумента допустимо, так как этот подзапрос возвращает единственное значение типа datetime.
Рекомендуемые упражнения: 94
На примере задачи 7.1.1 рассмотрим добавление интервала к дате для ряда других СУБД.
MySQL
MySQL имеет похожую функцию с непохожими аргументами. Вот синтаксис этой функции:
DATE_ADD(date, INTERVAL value addunit)
Здесь
date - дата, к которой прибавляется интервал;
value - величина интервала;
addunit - тип интервала.
Допустимы следующие типы интервалов, имена которых говорят сами за себя:
MICROSECOND |
SECOND |
MINUTE |
HOUR |
DAY |
WEEK |
MONTH |
QUARTER |
YEAR |
SECOND_MICROSECOND |
MINUTE_MICROSECOND |
MINUTE_SECOND |
HOUR_MICROSECOND |
HOUR_SECOND |
HOUR_MINUTE |
DAY_MICROSECOND |
DAY_SECOND |
DAY_MINUTE |
DAY_HOUR |
YEAR_MONTH |
Решение нашей задачи для MySQL примет вид:
SELECT DATE_ADD((SELECT MAX(date) FROM pass_in_trip), interval 7 day) next_wd;
[[ column ]] |
---|
[[ value ]] |
next_wd |
---|
2005-12-06 00:00:00 |
Чтобы добавить интервал, представляющий собой несколько компонентов времени, используется подстрока из стандартного представления даты/времени. Так, например, чтобы добавить к ‘2018-01-27T13:00:00’ один день и 3 часа, можно написать:
SELECT DATE_ADD('2018-01-27T13:00:00' , interval '1T3' DAY_HOUR);
[[ column ]] |
---|
[[ value ]] |
2018-01-28 16:00:00 |
Добавление 1 дня и 15 секунд будет выглядеть так:
SELECT DATE_ADD('2018-01-27T13:00:00', interval '01T00:00:15' DAY_SECOND);
[[ column ]] |
---|
[[ value ]] |
2018-01-28 13:00:15 |
PostgreSQL и Oracle
Эти СУБД не используют функцию. Для добавления интервала применяется обычный оператор сложения “+”:
SELECT MAX("date") + interval '7' day next_wd
FROM pass_in_trip;
[[ column ]] |
---|
[[ value ]] |
Обратите внимание, что величина интервала должна иметь символьный тип данных.
PostgreSQL
У PostgreSQL нет составных интервалов, поэтому можно либо выразить величину интервала в терминах меньшего интервала
SELECT timestamp'2018-01-27T13:00:00' + interval '27' hour;
[[ column ]] |
---|
[[ value ]] |
SELECT timestamp'2018-01-27T13:00:00' + interval '3' hour + interval '1' day;
[[ column ]] |
---|
[[ value ]] |
Аналогично можно поступить для добавления одного дня и 15 секунд, например:
SELECT timestamp'2018-01-27T13:00:00' + interval '15' second + interval '1' day;
[[ column ]] |
---|
[[ value ]] |
Oracle
Oracle позволяет использовать составные интервалы, например, 1 день и 3 часа:
SELECT timestamp'2018-01-27 13:00:00' + interval '01 03' DAY to HOUR from dual;
[[ column ]] |
---|
[[ value ]] |
и 1 день 15 секунд
SELECT timestamp'2018-01-27 13:00:00' + interval '01 00:00:15' DAY to SECOND from dual;
[[ column ]] |
---|
[[ value ]] |
Разумеется, можно также прибавить два простых интервала, как и в случае PostgreSQL.