Функция 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);
🚫
[[ error ]]
[[ column ]]
[[ value ]]

а можем и так:

SELECT DATEADD(ww, 1, current_timestamp);
🚫
[[ error ]]
[[ column ]]
[[ value ]]

В результате получим одно и то же значение; что-то типа 2005-11-04 00:11:28.683.

Однако мы не можем в этом случае написать:

SELECT DATEADD(mm, 1/4, current_timestamp);
🚫
[[ error ]]
[[ 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
                       )
              );
🚫
[[ error ]]
[[ 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;
🚫
[[ error ]]
[[ 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);
🚫
[[ error ]]
[[ column ]]
[[ value ]]
2018-01-28 16:00:00

Добавление 1 дня и 15 секунд будет выглядеть так:

SELECT DATE_ADD('2018-01-27T13:00:00', interval '01T00:00:15'  DAY_SECOND);
🚫
[[ error ]]
[[ column ]]
[[ value ]]
2018-01-28 13:00:15

PostgreSQL и Oracle

Эти СУБД не используют функцию. Для добавления интервала применяется обычный оператор сложения “+”:

SELECT MAX("date") + interval '7' day next_wd
FROM pass_in_trip;
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Обратите внимание, что величина интервала должна иметь символьный тип данных.

Добавить 1 день и 3 часа

PostgreSQL

У PostgreSQL нет составных интервалов, поэтому можно либо выразить величину интервала в терминах меньшего интервала

SELECT timestamp'2018-01-27T13:00:00' + interval '27' hour;
🚫
[[ error ]]
[[ column ]]
[[ value ]]
либо добавить два интервала

SELECT timestamp'2018-01-27T13:00:00' + interval '3' hour + interval '1' day;
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Аналогично можно поступить для добавления одного дня и 15 секунд, например:

SELECT timestamp'2018-01-27T13:00:00' + interval '15' second + interval '1' day;
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Oracle

Oracle позволяет использовать составные интервалы, например, 1 день и 3 часа:

SELECT timestamp'2018-01-27 13:00:00' + interval '01 03' DAY to HOUR from dual;
🚫
[[ error ]]
[[ column ]]
[[ value ]]

и 1 день 15 секунд

SELECT timestamp'2018-01-27 13:00:00' + interval '01 00:00:15' DAY to SECOND from dual;
🚫
[[ error ]]
[[ column ]]
[[ value ]]

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