DATEADD: примеры (SQL)
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. В более поздних версиях существенных изменений в работе функции не происходило.
Расширенные примеры
Вычисление последнего дня месяца.
SELECT DATEADD(day, -1, DATEADD(month, 1, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)));2023-05-31 00:00:00.000
Добавление интервала к значению времени.
SELECT DATEADD(minute, 30, CAST('10:00' AS time));10:30:00.0000000
Использование с оконными функциями для создания последовательности дат.
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
Корректировка дат в столбце таблицы на несколько часов вперед.
UPDATE Orders SET OrderDate = DATEADD(hour, 3, OrderDate) WHERE OrderID = 12345;Функция также может использоваться в вычисляемых столбцах и индексах для создания persisted computed columns.