DATEADD (Transact-SQL)
Belirtilen bir number aralığı (işaretli tamsayı), belirtilen bir date değerinin belirtilen bir datepart kısmına eklenmiş olarak o date değerini döndürür.
Tüm Transact-SQL tarih ve saat veri türleri ve işlevlerine genel bir bakış için, bkz. Tarih ve Saat veri türleri ve işlevler (Transact-sql).
Transact-SQL Sözdizim Kuralları
Sözdizimi
DATEADD (datepart , number , date )
Bağımsız değişkenler
datepart
date değerinin bir integer number eklendiği kısımdır. Aşağıdaki tablo tüm geçerli datepart değişkenlerini listelemektedir. Kullanıcı tanımlı değişken karşılıkları geçerli değildir.datepart
Kısaltmalar
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
date değerinin datepart kısmına eklenen bir int değerine çözülen bir ifadedir. Kullanıcı tanımlı değişkenler geçerlidir.Ondalık bir kesir ile bir değer belirtirseniz, değerin küsuru yuvarlanmaz, atılır.
date
Bir time, date, smalldatetime, datetime, datetime2 veya datetimeoffset değerine çözülebilen bir ifadedir. date bir ifade, bir sütun ifadesi, kullanıcı tanımlı bir değişken veya bir dize hazır değeri olabilir. İfade bir dize hazır değeriyse, bir datetime değerine çözülmelidir. Belirsizlikten kaçınmak için dört rakamlı yıllar kullanın. İki rakamlı yıllar hakkında daha fazla bilgi için, bkz. Yapılandırma iki basamaklı yıl kesme sunucu yapılandırma seçeneği.
Dönüş Türleri
Dönüş veri türü, dize hazır değerleri dışında date değişkeninin veri türüdür.
Dize hazır değerlerinin dönüş veri türü datetime türüdür. Dize hazır değeri saniye ölçeği üç haneden fazlaysa (. nnn) veya saat dilimi uzaklığı kısmını içeriyorsa bir hata oluşturulur.
datepart Değişkeni
dayofyear, day ve weekday aynı değeri döndürür.
Her datepart ve kısaltmaları aynı değeri döndürür.
datepart month ise ve date ayında dönüş ayından daha fazla gün olup date günü dönüş ayında yoksa, dönüş ayının son günü döndürülür. Örneğin, Eylül ayında 30 gün vardır; dolayısıyla aşağıdaki iki dönüş deyimi 2006-09-30 00:00:00.000 değerini döndürür:
SELECT DATEADD(month, 1, '2006-08-30')
SELECT DATEADD(month, 1, '2006-08-31')
number değişkeni int aralığını aşamaz. Aşağıdaki deyimlerde number değişkeni int aralığını 1 aşmaktadır. Aşağıdaki hata iletisi döndürülür: "İfade int veri türüne dönüştürülürken aritmetik taşma hatası oluştu."
SELECT DATEADD(year,2147483648, '2006-07-31');
SELECT DATEADD(year,-2147483649, '2006-07-31');
SELECT DATEADD(year,2147483648, '2006-07-31');
SELECT DATEADD(year,-2147483649, '2006-07-31');
date değişkeni veri türünün aralığı dışında bir değere artırılamaz. Aşağıdaki deyimlerde date değerine eklenen number değeri date veri türünün değerini aşmaktadır. Aşağıdaki hata iletisi döndürülür: "'datetime' sütununa bir değer eklenmesi taşmaya neden oldu."
SELECT DATEADD(year,2147483647, '2006-07-31');
SELECT DATEADD(year,-2147483647, '2006-07-31');
SELECT DATEADD(year,2147483647, '2006-07-31');
SELECT DATEADD(year,-2147483647, '2006-07-31');
Bir smalldatetime değerinin saniye kısmı her zaman 00'dır. date smalldatetime ise aşağıdakiler geçerlidir:
datepart second ise ve number -30 ile +29 arasındaysa, toplama yapılmaz.
datepart second ise ve number -30'den küçük veya +29'dan büyük ise, bir dakikadan başlayarak toplama yapılır.
datepart millisecond ise ve number -30001 ile +29998 arasındaysa, toplama yapılmaz.
datepart millisecond ise ve number -30001'den küçük veya +29998'den büyükse, bir dakikadan başlayarak toplama yapılır.
Açıklamalar
DATEADD işlevi SELECT <list>, WHERE, HAVING, GROUP BY ve ORDER BY yan tümcelerinde kullanılabilir.
Kesirli Saniyelerin Kesinliği
microsecond değerinin datepart kısmı veya date veri türleri smalldatetime, date ve datetime değerlerinin nanosecond kısmı toplama işleminde kullanılamaz.
Milisaniyelerin ölçeği 3 (.123), mikrosaniyelerin ölçeği 6 (.123456) ve nanosaniyelerin ölçeği 9'dur (.123456789). time, datetime2 ve datetimeoffset veri türlerinin en yüksek ölçeği 7'dir (.1234567). datepart nanosecond ise, date kesirli saniyeleri artmadan önce number değeri 100 olmalıdır. 1 ile 49 arasındaki bir number 0'a doğru aşağı; 50 ile 99 arasındaki bir sayı yukarı doğru 100'e yuvarlanır.
Aşağıdaki deyimler millisecond, microsecond veya nanosecond büyüklüğünde bir datepart eklemektedir.
DECLARE @datetime2 datetime2 = '2007-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);
/*
Returns:
1 millisecond 2007-01-01 13:10:10.1121111
2 milliseconds 2007-01-01 13:10:10.1131111
1 microsecond 2007-01-01 13:10:10.1111121
2 microseconds 2007-01-01 13:10:10.1111131
49 nanoseconds 2007-01-01 13:10:10.1111111
50 nanoseconds 2007-01-01 13:10:10.1111112
150 nanoseconds 2007-01-01 13:10:10.1111113
*/
DECLARE @datetime2 datetime2 = '2007-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);
/*
Returns:
1 millisecond 2007-01-01 13:10:10.1121111
2 milliseconds 2007-01-01 13:10:10.1131111
1 microsecond 2007-01-01 13:10:10.1111121
2 microseconds 2007-01-01 13:10:10.1111131
49 nanoseconds 2007-01-01 13:10:10.1111111
50 nanoseconds 2007-01-01 13:10:10.1111112
150 nanoseconds 2007-01-01 13:10:10.1111113
*/
Saat Dilimi Uzaklığı
Saat dilimi uzaklığında toplama işlemi kullanılamaz.
Örnekler
A.datepart değerini 1 artırma
Aşağıdaki deyimlerin her biri datepart değerini 1 artırmaktadır.
DECLARE @datetime2 datetime2 = '2007-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 2008-01-01 13:10:10.1111111
quarter 2007-04-01 13:10:10.1111111
month 2007-02-01 13:10:10.1111111
dayofyear 2007-01-02 13:10:10.1111111
day 2007-01-02 13:10:10.1111111
week 2007-01-08 13:10:10.1111111
weekday 2007-01-02 13:10:10.1111111
hour 2007-01-01 14:10:10.1111111
minute 2007-01-01 13:11:10.1111111
second 2007-01-01 13:10:11.1111111
millisecond 2007-01-01 13:10:10.1121111
microsecond 2007-01-01 13:10:10.1111121
nanosecond 2007-01-01 13:10:10.1111111
*/
DECLARE @datetime2 datetime2 = '2007-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 2008-01-01 13:10:10.1111111
quarter 2007-04-01 13:10:10.1111111
month 2007-02-01 13:10:10.1111111
dayofyear 2007-01-02 13:10:10.1111111
day 2007-01-02 13:10:10.1111111
week 2007-01-08 13:10:10.1111111
weekday 2007-01-02 13:10:10.1111111
hour 2007-01-01 14:10:10.1111111
minute 2007-01-01 13:11:10.1111111
second 2007-01-01 13:10:11.1111111
millisecond 2007-01-01 13:10:10.1121111
microsecond 2007-01-01 13:10:10.1111121
nanosecond 2007-01-01 13:10:10.1111111
*/
B.Bir deyimde datepart değerini birden fazla düzey artırma
Aşağıdaki deyimlerin her biri datepart değerini bir sonraki date parametresinin datepart kısmını da artıracak kadar büyük bir number değeri ile artırmaktadır.
DECLARE @datetime2 datetime2;
SET @datetime2 = '2007-01-01 01:01:01.1111111';
--Statement Result
-------------------------------------------------------------------
SELECT DATEADD(quarter,4,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(month,13,@datetime2); --2008-02-01 01:01:01.110
SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(day,365,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(week,5,@datetime2); --2007-02-05 01:01:01.110
SELECT DATEADD(weekday,31,@datetime2); --2007-02-01 01:01:01.110
SELECT DATEADD(hour,23,@datetime2); --2007-01-02 00:01:01.110
SELECT DATEADD(minute,59,@datetime2); --2007-01-01 02:00:01.110
SELECT DATEADD(second,59,@datetime2); --2007-01-01 01:02:00.110
SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.110
DECLARE @datetime2 datetime2;
SET @datetime2 = '2007-01-01 01:01:01.1111111';
--Statement Result
-------------------------------------------------------------------
SELECT DATEADD(quarter,4,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(month,13,@datetime2); --2008-02-01 01:01:01.110
SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(day,365,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(week,5,@datetime2); --2007-02-05 01:01:01.110
SELECT DATEADD(weekday,31,@datetime2); --2007-02-01 01:01:01.110
SELECT DATEADD(hour,23,@datetime2); --2007-01-02 00:01:01.110
SELECT DATEADD(minute,59,@datetime2); --2007-01-01 02:00:01.110
SELECT DATEADD(second,59,@datetime2); --2007-01-01 01:02:00.110
SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.110
C.number ve date parametrelerinde değişken olarak ifade kullanma
Aşağıdaki örnekler number ve date parametreleri için değişken olarak farklı tür ifadeler kullanmaktadır.
Sütunu date olarak belirtme
Aşağıdaki örnek, yeni bir PromisedShipDate hesaplamak için her OrderDate değerine 2 gün eklemektedir.
USE AdventureWorks2012;
GO
SELECT SalesOrderID
,OrderDate
,DATEADD(day,2,OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;
USE AdventureWorks2012;
GO
SELECT SalesOrderID
,OrderDate
,DATEADD(day,2,OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;
Kullanıcı tanımlı değişkenleri number ve date olarak belirtme
Aşağıdaki örnek kullanıcı tanımlı değişkenleri number ve date için değişken olarak belirtmektedir.
DECLARE @days int;
DECLARE @datetime datetime;
SET @days = 365;
SET @datetime = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */
SELECT DATEADD(day, @days, @datetime);
DECLARE @days int;
DECLARE @datetime datetime;
SET @days = 365;
SET @datetime = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */
SELECT DATEADD(day, @days, @datetime);
Skaler sistem işlevini date olarak belirtme
Aşağıdaki örnek date için SYSDATETIME değerini belirtmektedir.
SELECT DATEADD(month, 1, SYSDATETIME());
SELECT DATEADD(month, 1, SYSDATETIME());
Skaler alt sorguları ve skaler işlevleri number ve date olarak belirtme
Aşağıdaki örnek, MAX(ModifiedDate) skaler alt sorgularını number ve date için değişkenler olarak kullanmaktadır. (SELECT TOP 1 BusinessEntityID FROM Person.Person), bir değer listesinden bir number değişkeninin nasıl seçileceğini göstermek için number parametresi için yapay bir değişkendir.
USE AdventureWorks2012;
GO
SELECT DATEADD(month,(SELECT TOP 1 BusinessEntityID FROM Person.Person),
(SELECT MAX(ModifiedDate) FROM Person.Person));
USE AdventureWorks2012;
GO
SELECT DATEADD(month,(SELECT TOP 1 BusinessEntityID FROM Person.Person),
(SELECT MAX(ModifiedDate) FROM Person.Person));
Sabitleri number ve date olarak belirtme
Aşağıdaki örnek, number ve date için sayı ve karakter sabitleri kullanmaktadır.
SELECT DATEADD(minute, 1, ' 2007-05-07 09:53:01.0376635');
Sayısal ifadeleri ve skaler sistem işlevlerini number ve date olarak belirtme
Aşağıdaki örnek number ve date için sayısal bir ifade (-(10/2)), tekil işleci (-), aritmetik bir işleç (/) ve skaler sistem işlevleri (SYSDATETIME) kullanmaktadır.
SELECT DATEADD(month,-(10/2), SYSDATETIME());
SELECT DATEADD(month,-(10/2), SYSDATETIME());
Sıralama işlevlerini number olarak belirtme
Aşağıdaki örnek bir sıralama işlevini number için değişken olarak kullanmaktadır.
USE AdventureWorks2012;
GO
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;
USE AdventureWorks2012;
GO
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;
Toplu bir pencere işlevini number olarak belirtme
Aşağıdaki örnek toplu bir pencere işlevini number için bir değişken olarak kullanmaktadır.
USE AdventureWorks2012;
GO
SELECT SalesOrderID, ProductID, OrderQty
,DATEADD(day,SUM(OrderQty)
OVER(PARTITION BY SalesOrderID),SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO
USE AdventureWorks2012;
GO
SELECT SalesOrderID, ProductID, OrderQty
,DATEADD(day,SUM(OrderQty)
OVER(PARTITION BY SalesOrderID),SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO