DATEADD: примеры (SQL)

Использование функции DATEADD для работы с датами
Раздел: Даты и времени функции, Дата и время
DATEADD(datepart, number, date): date/time

Функция DATEADD в Microsoft SQL Server предназначена для добавления определенного интервала к указанной дате. Эта функция используется при необходимости смещения даты и времени вперед или назад на заданное количество единиц.

Описание и аргументы

Синтаксис функции: DATEADD (datepart, number, date).

  • 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), microsecond (mcs), nanosecond (ns).
  • number - целое число, которое добавляется к указанной части даты. Может быть положительным или отрицательным.
  • date - выражение, которое можно преобразовать в тип date, datetime, datetime2, smalldatetime, time, datetimeoffset.

Функция возвращает значение того же типа, что и аргумент date.

Примеры использования

Добавление дней к дате.

SELECT DATEADD(day, 10, '2023-05-15');
2023-05-25 00:00:00.000

Вычитание месяцев.

SELECT DATEADD(month, -2, '2023-05-15');
2023-03-15 00:00:00.000

Добавление часов.

SELECT DATEADD(hour, 5, '2023-05-15 10:00:00');
2023-05-15 15:00:00.000

Использование различных частей даты.

SELECT DATEADD(quarter, 1, '2023-01-15'), DATEADD(week, 3, '2023-01-15'), DATEADD(minute, 90, '2023-01-15 10:00:00');
2023-04-15 00:00:00.000, 2023-02-05 00:00:00.000, 2023-01-15 11:30:00.000

Похожие функции MS SQL

Для работы с датами в MS SQL применяются и другие функции.

  • DATEDIFF вычисляет разницу между двумя датами в указанных единицах.
  • DATEPART возвращает целое число, представляющее указанную часть даты.
  • GETDATE и SYSDATETIME возвращают текущую дату и время с разной точностью.

Функция DATEADD предпочтительна для арифметических операций с датами, тогда как DATEDIFF используется для вычисления интервалов.

Аналоги в других системах

В других СУБД существуют схожие операции.

MySQL: Функция DATE_ADD.

SELECT DATE_ADD('2023-05-15', INTERVAL 10 DAY);
2023-05-25

PostgreSQL: Используется оператор + с интервалами.

SELECT '2023-05-15'::date + INTERVAL '10 days';
2023-05-25

Oracle: Арифметика с датами осуществляется сложением чисел.

SELECT TO_DATE('2023-05-15', 'YYYY-MM-DD') + 10 FROM dual;
2023-05-25

Отличие MS SQL в едином синтаксисе для различных частей даты через параметр datepart.

Типичные ошибки

Ошибки часто возникают из-за некорректных аргументов.

Передача строки, которую невозможно преобразовать в дату.

SELECT DATEADD(day, 10, 'не дата');
Ошибка преобразования типа данных.

Использование недопустимого значения для datepart.

SELECT DATEADD(decade, 1, '2023-05-15');
Недопустимое значение параметра datepart.

Переполнение при добавлении микросекунд к значению smalldatetime.

SELECT DATEADD(microsecond, 1000000, '2023-05-15 23:59:59');
Возможно переполнение или потеря точности.

Изменения в версиях

В SQL Server 2008 были добавлены поддержка типов данных date, time, datetime2 и datetimeoffset, а также аргументы microsecond и nanosecond. В более поздних версиях существенных изменений в работе функции не происходило.

Расширенные примеры

Вычисление последнего дня месяца.

Пример sql
SELECT DATEADD(day, -1, DATEADD(month, 1, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)));
2023-05-31 00:00:00.000

Добавление интервала к значению времени.

Пример sql
SELECT DATEADD(minute, 30, CAST('10:00' AS time));
10:30:00.0000000

Использование с оконными функциями для создания последовательности дат.

Пример sql
WITH CTE AS (SELECT 1 n UNION ALL SELECT n+1 FROM CTE WHERE n < 10) SELECT DATEADD(day, n, '2023-05-01') FROM CTE;
2023-05-02 ... 2023-05-11

Корректировка дат в столбце таблицы на несколько часов вперед.

Пример sql
UPDATE Orders SET OrderDate = DATEADD(hour, 3, OrderDate) WHERE OrderID = 12345;

Функция также может использоваться в вычисляемых столбцах и индексах для создания persisted computed columns.

MS SQL DATEADD function comments

En
DATEADD Adds an interval to a specified date