Aracılığıyla paylaş


DATEADD (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft Fabric'teki SQL veritabanı

Bu işlev, giriş tarihinintarih bölümüne bir sayı (imzalı tamsayı) ekler ve değiştirilmiş bir tarih/saat değeri döndürür. Örneğin, bugünden itibaren 7.000 dakika olan tarihi bulmak için bu işlevi kullanabilirsiniz: sayı = 7000, datepart = minute, date = today.

Bu fonksiyon, giriş tarihininbir tarihine bir sayı (işaretli bigint) ekler ve değiştirilmiş bir tarih/zaman değeri döndürür. Örneğin, bugünden itibaren 7.000 dakika olan tarihi bulmak için bu işlevi kullanabilirsiniz: sayı = 7000, datepart = minute, date = today.

Tüm Transact-SQL tarih ve saat veri türlerine ve işlevlerine genel bakış için bkz. Tarih ve saat veri türleri ve işlevleri.

Transact-SQL söz dizimi kuralları

Syntax

DATEADD ( datepart , number , date )

Arguments

datepart

Tarihin bir DATEADDnumarası eklediği bölüm.

TarihinDATEADD büyük bir sayı ekleyen kısmı.

Bu tabloda tüm geçerli tarih bölümü bağımsız değişkenleri listelenir. DATEADD datepart bağımsız değişkenleri için kullanıcı tanımlı değişken eşdeğerlerini kabul etmez.

datepart Abbreviations
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

number

Tarihin bir tarih parçasına ekleyen DATEADD bir int'e çözümlenebilen ifade. DATEADD sayı için kullanıcı tanımlı değişken değerlerini kabul eder. DATEADD ondalık kesirli belirtilen sayı değerini kesirler. Bu durumda sayı değerini yuvarlamaz.

Tarihe katkı sağlayan bigint'eDATEADD çözümlenebilen bir ifade. DATEADD sayı için kullanıcı tanımlı değişken değerlerini kabul eder. DATEADD ondalık kesirli belirtilen sayı değerini kesirler. Bu durumda sayı değerini yuvarlamaz.

date

Aşağıdaki değerlerden birine çözümlenebilen bir ifade:

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time

Tarih için bir DATEADD sütun ifadesi, ifade, dize değişmez değeri veya kullanıcı tanımlı değişken kabul eder. Dize değişmez değeri bir tarih saat olarak çözümlenmelidir. Belirsizlik sorunlarını önlemek için dört basamaklı yılları kullanın. İki basamaklı yıllar hakkında bilgi için bkz . Sunucu yapılandırması: iki basamaklı yıl kesme .

Dönüş türleri

Bu yöntemin dönüş değeri veri türü dinamiktir. Dönüş türü için datesağlanan bağımsız değişkene bağlıdır. değeri date bir dize değişmez değeriyse, DATEADDbir tarih saat değeri döndürür. için dateDATEADD başka bir geçerli giriş veri türü sağlanırsa, aynı veri türünü döndürür. DATEADD dize değişmez saniye ölçeği üç ondalık basamak konumu (.nnn) aşıyorsa veya dize değişmez değeri saat dilimi uzaklığı bölümünü içeriyorsa hata verir.

Dönüş değeri

datepart bağımsız değişkeni

dayofyear, dayve weekday aynı değeri döndürür.

Her datepart ve kısaltmaları aynı değeri döndürür.

Aşağıdakiler doğruysa:

  • datepartmonth
  • tarih ayı, dönüş ayından daha fazla gün içerir
  • dönüş ayında tarih günü yok

Ardından, DATEADD dönüş ayının son gününü döndürür. Örneğin, Eylül ayının 30 (otuz) günü vardır; bu nedenle, bu deyimler döndürür 2024-09-30 00:00:00.000:

SELECT DATEADD(month, 1, '20240830');
SELECT DATEADD(month, 1, '2024-08-31');

sayı bağımsız değişkeni

Sayı bağımsız değişkeni int aralığını aşamaz. Aşağıdaki deyimlerde, sayı bağımsız değişkeni int aralığını 1 aşıyor.

SELECT DATEADD(year, 2147483648, '20240731');
SELECT DATEADD(year, -2147483649, '20240731');

Bu deyimlerin her ikisi de aşağıdaki hata iletisini döndürür:

Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.

Sayı argümanı bigint aralığını aşamaz. Aşağıdaki ifadelerde, sayı argümanı bigint aralığını 1 oranında aşar.

DECLARE @datetime2 AS DATETIME2;
SET @datetime2 = '2025-11-01 01:01:01.1111111';
SELECT DATEADD(nanosecond, 9223372036854775808, @datetime2);
SELECT DATEADD(nanosecond, -9223372036854775809, @datetime2);
GO

Bu deyimlerin her ikisi de aşağıdaki hata iletisini döndürür:

Msg 8115, Level 16, State 2, Line 3
Arithmetic overflow error converting expression to data type bigint.

tarih bağımsız değişkeni

DATEADD veri türü aralığının dışındaki bir değere artırılan tarih bağımsız değişkenini kabul etmez. Aşağıdaki deyimlerde, tarih değerine eklenen sayı değeri tarih veri türü aralığını aşıyor.

SELECT DATEADD(year, 2147483647, '20240731');
SELECT DATEADD(year, -2147483647, '20240731');

DATEADD aşağıdaki hata iletisini döndürür:

Msg 517, Level 16, State 1
Line 1 Adding a value to a 'datetime' column caused overflow.

Küçük saat tarihi ve ikinci veya kesirli saniye tarih bölümü için dönüş değerleri

Smalldatetime değerinin saniye bölümü her zaman 00'dır. Smalldatetimetarih değeri için aşağıdakiler geçerlidir:

  • bir tarih bölümüsecondve -30 ile +29 arasındaki bir DATEADD değeri için hiçbir değişiklik yapmaz.

  • bir tarih bölümüsecondve -30'dan küçük veya +29'dan büyük bir sayı değeri için, DATEADD toplama işlemini bir dakikadan başlayarak gerçekleştirir.

  • -30001 ile +29998 arasındaki millisecond ve DATEADD değeri için hiçbir değişiklik yapmaz.

  • tarih bölümümillisecond ve -30001'den küçük veya +29998'den büyük bir sayı değeri için toplama DATEADD işlemini bir dakikadan başlayarak gerçekleştirir.

Remarks

Aşağıdaki yan tümcelerde kullanın DATEADD :

  • GROUP BY
  • HAVING
  • ORDER BY
  • SELECT <list>
  • WHERE

Kesirli saniye duyarlığı

DATEADD smalldatetime, microsecond ve nanosecond veri türleri için veya tarih bölümü için eklemeye izin vermez.

Milisaniyelerin ölçeği 3 (.123 ), mikrosaniyelerin ölçeği 6 (.123456) ve nanosaniyelerin ölçeği 9 (.123456789). time, datetime2 ve datetimeoffset veri türleri en fazla 7 (.1234567 ölçeğine sahiptir). bir tarih bölümünanosecondiçin, sayı, tarih artışının kesirli saniyelerinden önce 100 olmalıdır. 1 ile 49 arasında bir sayı 0'a yuvarlanır ve 50 ile 99 arasında bir sayı 100'e yuvarlanır.

Bu deyimler , veya millisecondmicrosecondnanosecondekler.

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);

Sonuç kümesi aşağıdadır.

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

Saat dilimi farkı

DATEADD saat dilimi uzaklığı için toplamaya izin vermez.

Examples

A. Datepart değerini 1 aralıkla artırma

Bu deyimlerin her biri datepart değerini 1 aralığı artırır:

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);

Sonuç kümesi aşağıdadır.

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

B. Bir deyimde birden fazla datepart düzeyi artırma

Bu deyimlerin her biri datepart değerini, bir sonraki daha yüksek tarih kısmını da artıracak kadar büyük bir sayıartırır:

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

C. Sayı ve tarih parametreleri için bağımsız değişken olarak ifadeleri kullanma

Bu örneklerde sayı ve tarih parametreleri için bağımsız değişken olarak farklı ifade türleri kullanılır. Örneklerde AdventureWorks veritabanı kullanılır.

Sütunu tarih olarak belirtme

Bu örnek, adlı 2yeni bir sütun türetmek için sütundaki OrderDate her değere (iki) gün ekler PromisedShipDate :

SELECT SalesOrderID,
       OrderDate,
       DATEADD(day, 2, OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;

Kısmi bir sonuç kümesi aşağıdadır:

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

Kullanıcı tanımlı değişkenleri sayı ve tarih olarak belirtme

Bu örnek, sayı ve tarih için bağımsız değişken olarak kullanıcı tanımlı değişkenleri belirtir:

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);

Sonuç kümesi aşağıdadır.

2000-12-31 01:01:01.110

Skaler sistem işlevini tarih olarak belirtin

Bu örnekte tarih belirtildi SYSDATETIME. Döndürülen tam değer, deyimin yürütülme gününe ve saatlerine bağlıdır:

SELECT DATEADD(month, 1, SYSDATETIME());

Sonuç kümesi aşağıdadır.

2024-04-25 14:29:59.6727944

Skaler alt sorgular ve skaler işlevleri sayı ve tarih olarak belirtin

Bu örnekte sayı MAX(ModifiedDate) ve tarih bağımsız değişkenleri olarak skaler alt sorgular kullanılır. (SELECT TOP 1 BusinessEntityID FROM Person.Person)bir sayı bağımsız değişkeninin değer listesinden nasıl seçeceğini göstermek için sayı parametresi için yapay bir bağımsız değişken görevi görür.

SELECT DATEADD(month,
    (SELECT TOP 1 BusinessEntityID FROM Person.Person),
    (SELECT MAX(ModifiedDate) FROM Person.Person)
);

Sayısal ifadeleri ve skaler sistem işlevlerini sayı ve tarih olarak belirtin

Bu örnekte -(10 / 2)tarih bağımsız değişkenleri olarak sayısal ifade (-), tekli işleçler (/), SYSDATETIME () ve skaler sistem işlevleri () kullanılır.

SELECT DATEADD(month, -(10 / 2), SYSDATETIME());

Derecelendirme işlevlerini sayı olarak belirtme

Bu örnekte sayı için bağımsız değişken olarak bir derecelendirme işlevi kullanılır.

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;

Sayı olarak bir toplama penceresi işlevi belirtme

Bu örnekte sayı için bağımsız değişken olarak bir toplama penceresi işlevi kullanılır.

SELECT SalesOrderID,
       ProductID,
       OrderQty,
       DATEADD(day, SUM(OrderQty) OVER (PARTITION BY SalesOrderID), SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664);
GO