Функция 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 ]] |
|---|
| NULL [[ value ]] |
а можем и так:
SELECT DATEADD(ww, 1, current_timestamp);| [[ column ]] |
|---|
| NULL [[ value ]] |
В результате получим одно и то же значение; что-то типа 2005-11-04 00:11:28.683.
Однако мы не можем в этом случае написать:
SELECT DATEADD(mm, 1/4, current_timestamp);| [[ column ]] |
|---|
| NULL [[ 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 ]] |
|---|
| NULL [[ 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 ]] |
|---|
| NULL [[ 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 ]] |
|---|
| NULL [[ value ]] |
| 2018-01-28 16:00:00 |
Добавление 1 дня и 15 секунд будет выглядеть так:
SELECT DATE_ADD('2018-01-27T13:00:00', interval '01T00:00:15' DAY_SECOND);| [[ column ]] |
|---|
| NULL [[ value ]] |
| 2018-01-28 13:00:15 |
PostgreSQL и Oracle
Эти СУБД не используют функцию. Для добавления интервала применяется обычный оператор сложения “+”:
SELECT MAX("date") + interval '7' day next_wd
FROM pass_in_trip;| [[ column ]] |
|---|
| NULL [[ value ]] |
Обратите внимание, что величина интервала должна иметь символьный тип данных.
PostgreSQL
У PostgreSQL нет составных интервалов, поэтому можно либо выразить величину интервала в терминах меньшего интервала
SELECT timestamp'2018-01-27T13:00:00' + interval '27' hour;| [[ column ]] |
|---|
| NULL [[ value ]] |
либо добавить два интервала
SELECT timestamp'2018-01-27T13:00:00' + interval '3' hour + interval '1' day;| [[ column ]] |
|---|
| NULL [[ value ]] |
Аналогично можно поступить для добавления одного дня и 15 секунд, например:
SELECT timestamp'2018-01-27T13:00:00' + interval '15' second + interval '1' day;| [[ column ]] |
|---|
| NULL [[ value ]] |
Oracle
Oracle позволяет использовать составные интервалы, например, 1 день и 3 часа:
SELECT timestamp'2018-01-27 13:00:00' + interval '01 03' DAY to HOUR from dual;| [[ column ]] |
|---|
| NULL [[ value ]] |
и 1 день 15 секунд
SELECT timestamp'2018-01-27 13:00:00' + interval '01 00:00:15' DAY to SECOND from dual;| [[ column ]] |
|---|
| NULL [[ value ]] |
Разумеется, можно также прибавить два простых интервала, как и в случае PostgreSQL.