Aracılığıyla paylaş


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

Konu bağlantısı simgesi 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

Ayrıca bkz.

Başvuru

CAST ve CONVERT (Transact-SQL)