Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
конечной точке аналитики платформы Аналитики Azure Synapse Analytics
(PDW)
в Microsoft Fabric
Хранилище в Microsoft Fabric
Эта функция добавляет number (целое число со знаком) в область datepartдаты ввода и возвращает измененное значение даты или времени. Например, эту функцию можно использовать для поиска даты, которая составляет 7000 минут с сегодняшнего дня: число = 7000, датапарт = минута, дата = сегодня.
Общие сведения о всех типах и функциях данных и функций даты и времени Transact-SQL см. в разделе "Типы и функции данных даты и времени".
Соглашения о синтаксисе Transact-SQL
Синтаксис
DATEADD (datepart , number , date )
Аргументы
datepart
Часть даты, к которой добавляетсяDATEADD
целое число.
Примечание.
В Базе данных SQL Azure Управляемый экземпляр SQL Azure и база данных SQL в Microsoft Fabric можно выразить как большой. Эта функция предоставляется в виде предварительной версии.
В приведенной ниже таблице перечислены все допустимые аргументы datepart.
DATEADD
не принимает эквивалентные переменные, определяемые пользователем, для аргументов datepart.
datepart | Аббревиатуры |
---|---|
year |
yy , yyyy |
quarter |
qq , q |
month |
mm , m |
dayofyear |
dy , y |
day |
dd , d |
week |
wk , ww |
weekday |
dw , w |
hour |
hh |
minute |
mi , n |
second |
ss , s |
millisecond |
ms |
microsecond |
mcs |
nanosecond |
ns |
номер
Выражение, которое разрешается в тип int, добавляемый DATEADD
к компоненту datepart даты date.
DATEADD
принимает определяемые пользователем значения переменных для number.
DATEADD
Усечение указанного числа , которое имеет десятичную дробь. В этой ситуации число не округляется.
Примечание.
В Базе данных SQL Azure и базе данных SQL в Microsoft Fabric число может быть выражено как bigint. Эта функция предоставляется в виде предварительной версии.
date
Выражение, которое может быть разрешено в одно из следующих значений.
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- Время
Для датыDATEADD
принимает выражение столбца, выражение, строковый литерал или определяемую пользователем переменную. Значение строкового литерала должно разрешаться в datetime. Во избежание неоднозначности используйте четырехзначную запись года. См . раздел конфигурации сервера: двухзначный отрезок года для получения сведений о двухзначных годах.
Типы возвращаемых данных
Тип данных возвращаемого значения для этого метода является динамическим. Тип возвращаемого значения зависит от типа аргумента, переданного в date
. Если значение для date
является строковым литералом даты, DATEADD
возвращает значение datetime. Если для date
предоставляется другой тип допустимых входных данных, DATEADD
возвращает тот же тип данных.
DATEADD
Вызывает ошибку, если шкала строковых литералов в секундах превышает три десятичные позиции (.nnn
) или если строковый литерал содержит часть смещения часового пояса.
Возвращаемое значение
Аргумент datepart
dayofyear
, day
и weekday
возвращает то же значение.
Каждое выражение datepart и его краткие формы возвращают одно и то же значение.
Если верны следующие условия:
-
datepart имеет значение
month
- в месяце date больше дней, чем в возвращаемом месяце;
- День даты не существует в возвращаемом месяце
то DATEADD
возвращает последний день возвращаемого месяца. Например, сентябрь имеет 30 (тридцать) дней; Поэтому эти инструкции возвращают 2024-09-30 00:00:00.000
:
SELECT DATEADD(month, 1, '20240830');
SELECT DATEADD(month, 1, '2024-08-31');
аргумент number
Аргумент числа не может превышать диапазон int. В следующих инструкциях аргумент числа превышает диапазон int на 1.
SELECT DATEADD(year, 2147483648, '20240731');
SELECT DATEADD(year, -2147483649, '20240731');
Эти операторы возвращают следующее сообщение об ошибке:
Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int.
Примечание.
В Базе данных SQL Azure и базе данных SQL в Microsoft Fabric число может быть выражено как bigint. Эта функция предоставляется в виде предварительной версии.
Аргумент date
DATEADD
не принимает аргумент даты , добавим к значению за пределами диапазона его типа данных. В приведенных ниже инструкциях значение number, добавленное к значению date, превышает диапазон типа данных date.
SELECT DATEADD(year, 2147483647, '20240731');
SELECT DATEADD(year, -2147483647, '20240731');
DATEADD
возвращает следующее сообщение об ошибке:
Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow.
Возвращаемые значения для даты небольшого времени и второй или дробной даты секунды
Значение секунд даты типа smalldatetime всегда равно 00. Для значения date типа smalldatetime действуют указанные ниже условия.
даты и
second
от -30 до +29 не вносит изменений.даты и
second
меньше -30 или более +29 выполняет его добавление, начиная с одной минуты.даты и
millisecond
от -30001 до +29998 не вносит изменений.даты и
millisecond
меньше -30001 или более 29998 выполняет его добавление, начиная с одной минуты.
Замечания
Используйте DATEADD
в следующих предложениях.
GROUP BY
HAVING
ORDER BY
SELECT <list>
WHERE
Точность в долях секунды
DATEADD
не допускает добавление датыmicrosecond
или nanosecond
типы данных даты smalldatetime, date и datetime.
Миллисекунды имеют масштаб 3 (.123
), микросекунды имеют масштаб 6 (.123456
), а наносекунды имеют масштаб 9 (.123456789
).
Типы данных datetime2 и datetimeoffset имеют максимальный масштаб 7 ()..1234567
Для частиnanosecond
даты число должно быть 100 до увеличения даты дробной секунды. Число от 1 до 49 округляется до 0, а число от 50 до 99 округляется до 100.
Эти инструкции добавляют частьmillisecond
даты или. microsecond
nanosecond
DECLARE @datetime2 AS DATETIME2 = '2024-01-01 13:10:10.1111111';
SELECT '1 millisecond', DATEADD(millisecond, 1, @datetime2)
UNION ALL
SELECT '2 milliseconds', DATEADD(millisecond, 2, @datetime2)
UNION ALL
SELECT '1 microsecond', DATEADD(microsecond, 1, @datetime2)
UNION ALL
SELECT '2 microseconds', DATEADD(microsecond, 2, @datetime2)
UNION ALL
SELECT '49 nanoseconds', DATEADD(nanosecond, 49, @datetime2)
UNION ALL
SELECT '50 nanoseconds', DATEADD(nanosecond, 50, @datetime2)
UNION ALL
SELECT '150 nanoseconds', DATEADD(nanosecond, 150, @datetime2);
Вот результирующий набор.
1 millisecond 2024-01-01 13:10:10.1121111
2 milliseconds 2024-01-01 13:10:10.1131111
1 microsecond 2024-01-01 13:10:10.1111121
2 microseconds 2024-01-01 13:10:10.1111131
49 nanoseconds 2024-01-01 13:10:10.1111111
50 nanoseconds 2024-01-01 13:10:10.1111112
150 nanoseconds 2024-01-01 13:10:10.1111113
Смещение часового пояса
DATEADD
не разрешает добавление смещения часового пояса.
Примеры
А. Приращение даты на интервал 1
Каждая из этих инструкций увеличивает часть даты datepart на интервал, равный 1.
DECLARE @datetime2 AS DATETIME2 = '2024-01-01 13:10:10.1111111';
SELECT 'year', DATEADD(year, 1, @datetime2)
UNION ALL
SELECT 'quarter', DATEADD(quarter, 1, @datetime2)
UNION ALL
SELECT 'month', DATEADD(month, 1, @datetime2)
UNION ALL
SELECT 'dayofyear', DATEADD(dayofyear, 1, @datetime2)
UNION ALL
SELECT 'day', DATEADD(day, 1, @datetime2)
UNION ALL
SELECT 'week', DATEADD(week, 1, @datetime2)
UNION ALL
SELECT 'weekday', DATEADD(weekday, 1, @datetime2)
UNION ALL
SELECT 'hour', DATEADD(hour, 1, @datetime2)
UNION ALL
SELECT 'minute', DATEADD(minute, 1, @datetime2)
UNION ALL
SELECT 'second', DATEADD(second, 1, @datetime2)
UNION ALL
SELECT 'millisecond', DATEADD(millisecond, 1, @datetime2)
UNION ALL
SELECT 'microsecond', DATEADD(microsecond, 1, @datetime2)
UNION ALL
SELECT 'nanosecond', DATEADD(nanosecond, 1, @datetime2);
Вот результирующий набор.
year 2025-01-01 13:10:10.1111111
quarter 2024-04-01 13:10:10.1111111
month 2024-02-01 13:10:10.1111111
dayofyear 2024-01-02 13:10:10.1111111
day 2024-01-02 13:10:10.1111111
week 2024-01-08 13:10:10.1111111
weekday 2024-01-02 13:10:10.1111111
hour 2024-01-01 14:10:10.1111111
minute 2024-01-01 13:11:10.1111111
second 2024-01-01 13:10:11.1111111
millisecond 2024-01-01 13:10:10.1121111
microsecond 2024-01-01 13:10:10.1111121
nanosecond 2024-01-01 13:10:10.1111111
В. Увеличение нескольких уровней даты в одной инструкции
Каждая из этих инструкций увеличивает часть даты datepart на число number, достаточно большое, чтобы также увеличить следующую часть datepart даты date.
DECLARE @datetime2 AS DATETIME2;
SET @datetime2 = '2024-01-01 01:01:01.1111111';
--Statement Result
-------------------------------------------------------------------
SELECT DATEADD(quarter, 4, @datetime2); --2025-01-01 01:01:01.1111111
SELECT DATEADD(month, 13, @datetime2); --2025-02-01 01:01:01.1111111
SELECT DATEADD(dayofyear, 366, @datetime2); --2025-01-01 01:01:01.1111111
SELECT DATEADD(day, 366, @datetime2); --2025-01-01 01:01:01.1111111
SELECT DATEADD(week, 5, @datetime2); --2024-02-05 01:01:01.1111111
SELECT DATEADD(weekday, 31, @datetime2); --2024-02-01 01:01:01.1111111
SELECT DATEADD(hour, 23, @datetime2); --2024-01-02 00:01:01.1111111
SELECT DATEADD(minute, 59, @datetime2); --2024-01-01 02:00:01.1111111
SELECT DATEADD(second, 59, @datetime2); --2024-01-01 01:02:00.1111111
SELECT DATEADD(millisecond, 1, @datetime2); --2024-01-01 01:01:01.1121111
В. Использование выражений в качестве аргументов для параметров number и date
В этих примерах выражения различного типа используются в качестве аргументов для параметров number и date. В примерах используется база данных AdventureWorks.
Указание столбца в качестве аргумента date
В этом примере к каждому значению в столбце 2
добавляется OrderDate
(два) дня, чтобы получить новый столбец с именем PromisedShipDate
.
SELECT SalesOrderID,
OrderDate,
DATEADD(day, 2, OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;
Ниже приведен частичный результирующий набор:
SalesOrderID OrderDate PromisedShipDate
------------ ----------------------- -----------------------
43659 2005-07-01 00:00:00.000 2005-07-03 00:00:00.000
43660 2005-07-01 00:00:00.000 2005-07-03 00:00:00.000
43661 2005-07-01 00:00:00.000 2005-07-03 00:00:00.000
...
43702 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43703 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43704 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43705 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43706 2005-07-03 00:00:00.000 2005-07-05 00:00:00.000
...
43711 2005-07-04 00:00:00.000 2005-07-06 00:00:00.000
43712 2005-07-04 00:00:00.000 2005-07-06 00:00:00.000
...
43740 2005-07-11 00:00:00.000 2005-07-13 00:00:00.000
43741 2005-07-12 00:00:00.000 2005-07-14 00:00:00.000
Указание пользовательских переменных в качестве аргументов number и date
В этом примере в качестве аргументов number и date указываются пользовательские переменные.
DECLARE
@days AS INT = 365,
@datetime AS DATETIME = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */
SELECT DATEADD(day, @days, @datetime);
Вот результирующий набор.
2000-12-31 01:01:01.110
Указание в качестве аргумента date скалярной системной функции
В этом примере для аргумента SYSDATETIME
указано значение . Точное возвращаемое значение зависит от дня и времени выполнения инструкции.
SELECT DATEADD(month, 1, SYSDATETIME());
Вот результирующий набор.
2024-04-25 14:29:59.6727944
Указание в качестве аргументов number и date скалярных вложенных запросов и скалярных функций
В этом примере в качестве аргументов для MAX(ModifiedDate)
и date используются скалярные вложенные запросы .
(SELECT TOP 1 BusinessEntityID FROM Person.Person)
является искусственным аргументом для числового параметра, показывающим способ выбора аргумента number из списка значений.
SELECT DATEADD(month,
(SELECT TOP 1 BusinessEntityID FROM Person.Person),
(SELECT MAX(ModifiedDate) FROM Person.Person)
);
Указание в качестве аргументов number и date числовых выражений и скалярных системных функций
В этом примере используется числовое выражение (), -(10 / 2)
(-
), арифметический оператор (/
) и скалярные системные функции (SYSDATETIME
) в качестве аргументов для числа и даты.
SELECT DATEADD(month, -(10 / 2), SYSDATETIME());
Указание функций ранжирования в качестве числа
В этом примере в качестве аргумента number используется ранжирующая функция.
SELECT p.FirstName,
p.LastName,
DATEADD(day, ROW_NUMBER() OVER (ORDER BY a.PostalCode), SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;
Указание в качестве аргумента number статистической оконной функции
В этом примере в качестве аргумента number используется агрегатная оконная функция.
SELECT SalesOrderID,
ProductID,
OrderQty,
DATEADD(day, SUM(OrderQty) OVER (PARTITION BY SalesOrderID), SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664);
GO