DATEADD (Transact-SQL)

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics Analytics yesPlatform System (PDW)

Fungsi ini menambahkan angka (bilangan bulat bertanda tangan) ke bagian tanggalinput, dan mengembalikan nilai tanggal/waktu yang dimodifikasi. Misalnya, Anda dapat menggunakan fungsi ini untuk menemukan tanggal 7000 menit dari hari ini: angka = 7000, datepart = menit, tanggal = hari ini.

Lihat Jenis dan Fungsi Data Tanggal dan Waktu (SQL T-SQL) untuk gambaran umum semua jenis dan fungsi data tanggal dan waktu transact-SQL.

Topic link iconKonvensi Sintaksis T-SQL

Sintaks

DATEADD (datepart , number , date )  

Catatan

Untuk melihat sintaks transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

datepart
Bagian tanggal yang DATEADD menambahkan bilanganbulat. Tabel ini mencantumkan semua argumen datepart yang valid.

Catatan

DATEADD tidak menerima variabel yang ditentukan pengguna yang setara untuk argumen datepart .

datepart Singkatan
tahun yy, yyyy
kuartal qq, q
bulan mm, m
dayofyear dy, y
hari dd, d
minggu wk, ww
hari kerja dw, w
jam hh
menit mi, n
detik ss, s
milidetik ms
mikrosecond Mcs
nanodetik Ns

number
Ekspresi yang dapat mengatasi int yang DATEADD ditambahkan ke bagian tanggal. DATEADD menerima nilai variabel yang ditentukan pengguna untuk angka. DATEADD akan memotong nilai angka tertentu yang memiliki pecahan desimal. Ini tidak akan membulatkan nilai angka dalam situasi ini.

date
Ekspresi yang bisa diatasi ke salah satu nilai berikut ini:

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

Untuk tanggal, DATEADD akan menerima ekspresi kolom, ekspresi, string literal, atau variabel yang ditentukan pengguna. Nilai literal string harus diselesaikan ke tanggalwaktu. Gunakan empat digit tahun untuk menghindari masalah ambiguitas. Lihat Mengonfigurasi Opsi Konfigurasi Server cutoff dua digit tahun untuk informasi tentang dua digit tahun.

Tipe yang dikembalikan

Jenis data nilai yang dikembalikan untuk metode ini bersifat dinamis. Jenis pengembalian tergantung pada argumen yang disediakan untuk date. Jika nilai untuk date adalah tanggal harfiah string, DATEADD mengembalikan nilai tanggalwaktu . Jika jenis data input lain yang valid disediakan untuk date, DATEADD mengembalikan jenis data yang sama. DATEADD menimbulkan kesalahan jika skala detik harfiah string melebihi tiga posisi tempat desimal (.nnn) atau jika string literal berisi bagian offset zona waktu.

Tampilkan Nilai

Argumen datepart

dayofyear, day, dan weekday mengembalikan nilai yang sama.

Setiap datepart dan singkatannya mengembalikan nilai yang sama.

Jika berikut ini benar:

  • datepart adalah bulan
  • bulan tanggal memiliki lebih banyak hari daripada bulan pengembalian
  • tanggal tidak ada dalam bulan pengembalian

Kemudian, DATEADD mengembalikan hari terakhir bulan pengembalian. Misalnya, September memiliki 30 (tiga puluh) hari; oleh karena itu, pernyataan ini mengembalikan 2006-09-30 00:00:00.000:

SELECT DATEADD(month, 1, '20060830');
SELECT DATEADD(month, 1, '2006-08-31');

Argumen angka

Argumen angka tidak boleh melebihi rentang int. Dalam pernyataan berikut, argumen untuk angka melebihi rentang int sebesar 1. Pernyataan ini mengembalikan pesan kesalahan berikut: "Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int."

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

Argumen tanggal

DATEADD tidak akan menerima argumen tanggal yang dinaikkan ke nilai di luar rentang tipe datanya. Dalam pernyataan berikut, nilai angka yang ditambahkan ke nilai tanggal melebihi rentang jenis data tanggal . DATEADD mengembalikan pesan kesalahan berikut: "Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow."

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

Mengembalikan Nilai untuk tanggal smalldatetime dan tanggal detik atau Pecahan

Bagian detik dari nilai smalldatetime selalu 00. Untuk nilai tanggalsmalldatetime, berikut ini berlaku:

  • Untuk bagian tanggaldetik, dan nilai angka antara -30 dan +29, DATEADD tidak membuat perubahan.
  • Untuk datepartdetik, dan nilai angka kurang dari -30, atau lebih dari +29, DATEADD melakukan penambahannya dimulai pada satu menit.
  • Untuk bagian tanggalmilidetik dan nilai angka antara -30001 dan +29998, DATEADD tidak membuat perubahan.
  • Untuk bagian tanggalmilidetik dan nilai angka kurang dari -30001, atau lebih dari +29998, DATEADD melakukan penambahannya dimulai pada satu menit.

Keterangan

Gunakan DATEADD dalam klausa berikut:

  • KELOMPOKKAN MENURUT
  • HAVING
  • URUTKAN MENURUT
  • Daftar SELECT <>
  • WHERE

Presisi detik pecahan

DATEADD tidak mengizinkan penambahan untuk bagian tanggalmikrodetik atau nanodetik untuk jenis data tanggalsmalldatetime, tanggal, dan tanggalwaktu.

Milidetik memiliki skala 3 (.123), mikrodetik memiliki skala 6 (.123456), dan nanodetik memiliki skala 9 (.123456789). Jenis data time, datetime2, dan datetimeoffset memiliki skala maksimum 7 (.1234567). Untuk bagian tanggalnanodetik, angka harus 100 sebelum detik pecahan tanggal meningkat. Angka antara 1 dan 49 akan membulatkan ke bawah ke 0, dan angka dari 50 hingga 99 membulatkan ke atas hingga 100.

Pernyataan ini menambahkan bagian tanggalmilidetik, mikrodetik, atau nanodetik.

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

Berikut adalah hasil yang ditetapkan.

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  

Offset zona waktu

DATEADD tidak mengizinkan penambahan untuk offset zona waktu.

Contoh

A. Bertambahkan datepart dengan interval 1

Masing-masing pernyataan ini menaikkan datepart dengan interval 1:

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

Berikut adalah tataan hasil.

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. Meningkatkan lebih dari satu tingkat datepart dalam satu pernyataan

Masing-masing pernyataan ini menambah datepart dengan angka yang cukup besar untuk menambah dateparttanggal berikutnya yang lebih tinggi:

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.1111111  
SELECT DATEADD(month,13,@datetime2);      --2008-02-01 01:01:01.1111111  
SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.1111111  
SELECT DATEADD(day,365,@datetime2);       --2008-01-01 01:01:01.1111111  
SELECT DATEADD(week,5,@datetime2);        --2007-02-05 01:01:01.1111111  
SELECT DATEADD(weekday,31,@datetime2);    --2007-02-01 01:01:01.1111111  
SELECT DATEADD(hour,23,@datetime2);       --2007-01-02 00:01:01.1111111  
SELECT DATEADD(minute,59,@datetime2);     --2007-01-01 02:00:01.1111111  
SELECT DATEADD(second,59,@datetime2);     --2007-01-01 01:02:00.1111111  
SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.1121111  

C. Menggunakan ekspresi sebagai argumen untuk parameter angka dan tanggal

Contoh ini menggunakan berbagai jenis ekspresi sebagai argumen untuk parameter angka dan tanggal. Contohnya menggunakan database AdventureWorks.

Menentukan kolom sebagai tanggal

Contoh ini menambahkan 2 (dua) hari ke setiap nilai dalam OrderDate kolom, untuk mendapatkan kolom baru bernama PromisedShipDate:

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

Tataan hasil parsial:

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  
  

Menentukan variabel yang ditentukan pengguna sebagai angka dan tanggal

Contoh ini menentukan variabel yang ditentukan pengguna sebagai argumen untuk angka dan tanggal:

DECLARE @days INT = 365,   
        @datetime DATETIME = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */;  
SELECT DATEADD(day, @days, @datetime);  

Berikut adalah tataan hasil.

-----------------------  
2000-12-31 01:01:01.110  
  
(1 row(s) affected)  

Menentukan fungsi sistem skalar sebagai tanggal

Contoh ini menentukan SYSDATETIME untuk tanggal. Nilai pasti yang dikembalikan tergantung pada hari dan waktu pelaksanaan pernyataan:

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

Berikut adalah tataan hasil.

---------------------------  
2013-02-06 14:29:59.6727944  
  
(1 row(s) affected)  

Menentukan subkueri skalar dan fungsi skalar sebagai angka dan tanggal

Contoh ini menggunakan subkueri skalar, MAX(ModifiedDate), sebagai argumen untuk angka dan tanggal. (SELECT TOP 1 BusinessEntityID FROM Person.Person) berfungsi sebagai argumen buatan untuk parameter angka, untuk memperlihatkan cara memilih argumen angka dari daftar nilai.

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

Menentukan ekspresi numerik dan fungsi sistem skalar sebagai angka dan tanggal

Contoh ini menggunakan ekspresi numerik (-(10/2)), operator unary (-), operator aritmatika (/), dan fungsi sistem skalar (SYSDATETIME) sebagai argumen untuk angka dan tanggal.

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

Menentukan fungsi peringkat sebagai angka

Contoh ini menggunakan fungsi peringkat sebagai argumen untuk angka.

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;  

Menentukan fungsi jendela agregat sebagai angka

Contoh ini menggunakan fungsi jendela agregat sebagai argumen untuk angka.

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

Lihat juga

CAST dan CONVERT (SQL Transact)