Bir tarih veya zaman damgası değerine bir zaman aralığı ekler veya bu değerden bir zaman aralığı çıkarır.
Sözdizimi
DATEADD(DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <date>, BIGINT <delta>, STRING <datepart>)
Parametreler
date (zorunlu)
Değiştirilecek tarih veya zaman damgası. Desteklenen türler: DATE, DATETIME, TIMESTAMP ve TIMESTAMP_NTZ.
MaxCompute 1,0 veri türü sürümünde, yyyy-mm-dd hh:mi:ss biçimindeki bir STRING değeri örtük olarak DATETIME türüne dönüştürülür. Örneğin, '2025-07-21 00:00:00' ifadesi bir DATETIME değeri olarak işlenir.
delta (zorunlu)
Eklenecek veya çıkarılacak zaman birimi sayısı. Bu parametre BIGINT türündedir. Pozitif bir değer aralığı ekler; negatif bir değer aralığı çıkarır. Örneğin, 7 gün eklemek için delta değerini 7 olarak ayarlayın. 3 ay çıkarmak için delta değerini -3 olarak ayarlayın.
MaxCompute 1,0 veri türü sürümünde, STRING ve DOUBLE değerleri örtük olarak BIGINT türüne dönüştürülür.
delta değerinin eklenmesi veya çıkarılması, daha büyük bir zaman birimine taşıma veya borç alınmasına neden olabilir. Örneğin, 20 ay eklemek yılın artmasına yol açar. Yıl, ay, saat, dakika ve saniye bileşenleri sırasıyla 10'luk, 12'lik, 24'lük ve 60'lık sayı sistemlerini takip eder.
datepart (zorunlu)
Aralığın zaman birimi. Bu parametre bir STRING sabiti olmalıdır. Sabit olmayan değerler, desteklenmeyen biçimler veya diğer veri türleri hata döndürür.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dönüş değeri
Giriş date parametresiyle aynı türde (DATE, DATETIME, TIMESTAMP veya TIMESTAMP_NTZ) bir değer döndürür.
| Koşul | Sonuç |
|---|---|
date DATE, DATETIME, TIMESTAMP veya TIMESTAMP_NTZ değil |
Hata |
date NULL |
Hata |
delta NULL |
NULL |
datepart NULL |
NULL |
Ay sonu işleme
datepart değeri month (veya quarter) olduğunda, DATEADD elde edilen ayda yeterli gün varsa gün değerini korur. Elde edilen ayda daha az gün varsa, gün o ayın son gününe ayarlanır.
-- January 29 + 1 month: February 2005 has only 28 days, so the result is February 28.
SELECT DATEADD(DATETIME '2005-01-29 00:00:00', 1, 'mm');
-- Result: 2005-02-28 00:00:00
-- March 30 - 1 month: February 2005 has only 28 days, so the result is February 28.
SELECT DATEADD(DATETIME '2005-03-30 00:00:00', -1, 'mm');
-- Result: 2005-02-28 00:00:00
Örnekler
Her datepart değerinin etkisi
Her sorgu, aynı temel tarihe farklı bir datepart uygular:
-- Year: add 1 year
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 1, 'yyyy');
-- Result: 2006-02-28 00:00:00
-- Quarter: add 1 quarter (3 months)
SELECT DATEADD(DATE '2005-02-28', 1, 'quarter');
-- Result: 2005-05-28
-- Month: add 1 month
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 1, 'mm');
-- Result: 2005-03-28 00:00:00
-- Week: add 2 weeks (14 days)
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 2, 'week');
-- Result: 2005-03-14 00:00:00
-- Day: add 1 day
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 1, 'dd');
-- Result: 2005-03-01 00:00:00
-- Hour: subtract 3 hours
SELECT DATEADD(DATETIME '2005-03-30 05:24:00', -3, 'hh');
-- Result: 2005-03-30 02:24:00
-- Minute: subtract 30 minutes
SELECT DATEADD(DATETIME '2005-03-30 05:24:00', -30, 'mi');
-- Result: 2005-03-30 04:54:00
-- Second: subtract 30 seconds
SELECT DATEADD(DATETIME '2005-03-30 05:24:00', -30, 'ss');
-- Result: 2005-03-30 05:23:30
-- Millisecond: add 1000 milliseconds (1 second) to a TIMESTAMP_NTZ value
SELECT DATEADD(TIMESTAMP_NTZ '2005-02-28 00:00:00.123456', 1000, 'ff3');
-- Result: 2005-02-28 00:00:01.123456
-- Microsecond: add 1000 microseconds to a TIMESTAMP value
SELECT DATEADD(TIMESTAMP '2005-02-28 00:00:00.123456', 1000, 'ff6');
-- Result: 2005-02-28 00:00:00.124456
Bir gün çıkarın
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', -1, 'dd');
-- Result: 2005-02-27 00:00:00
Yıllar arasında ay taşması
20 ay eklemek, ayın taşmasına ve yılın artmasına neden olur:
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 20, 'mm');
-- Result: 2006-10-28 00:00:00
DATE değerine 1 ay ekleyin
SELECT DATEADD(DATE '2005-02-18', 1, 'mm');
-- Result: 2005-03-18
TIMESTAMP ile alt saniye hassasiyetini koruyun
SELECT DATEADD(TIMESTAMP '2005-02-28 00:00:00.123', 14, 'day');
-- Result: 2005-03-14 00:00:00.123
GETDATE ile göreli tarihler
Mevcut zamana göreli tarihleri hesaplamak için DATEADD işlevini GETDATE ile birlikte kullanın. Örneğin, DATEADD(GETDATE(), -1, 'dd') ifadesi dün tarihini döndürür.
-- Assuming the current time is 2020-11-17 16:31:44
SELECT DATEADD(GETDATE(), -1, 'dd');
-- Result: 2020-11-16 16:31:44
NULL datepart NULL döndürür
SELECT DATEADD(DATE '2005-02-18', 1, NULL);
-- Result: NULL
Veri türü sürümü davranışı
MaxCompute 2,0 veri türü sürümü
date değeri DATE, DATETIME, TIMESTAMP veya TIMESTAMP_NTZ değilse, açıkça tür dönüştürme işlemi uygulayın. Aksi takdirde hata döndürülür.
SELECT DATEADD(CAST('2005-03-30 00:00:00' AS datetime), -1, 'mm');
-- Result:
-- +------------+
-- | _c0 |
-- +------------+
-- | 2005-02-28 00:00:00 |
-- +------------+
2,0 veri türü sürümünü etkinleştirmek için aşağıdaki SET komutunu SQL deyimiyle birlikte gönderin:
set odps.sql.type.system.odps2=true;
SELECT DATEADD(TIMESTAMP '2005-02-18 00:00:00', 1, 'mm');
-- Result: 2005-03-18 00:00:00.0
MaxCompute 1,0 veri türü sürümü
yyyy-mm-dd hh:mi:ss biçimindeki STRING değerleri örtük olarak DATETIME türüne dönüştürülür. Bu biçimle eşleşmeyen bir STRING NULL döndürür.
-- Set the data type edition to 1.0.
SET odps.sql.type.system.odps2=false;
SET odps.sql.hive.compatible=false;
-- This STRING does not match the yyyy-mm-dd hh:mi:ss format, so NULL is returned.
SELECT DATEADD('2021-08-27',1,'dd');
-- This STRING matches the format and is implicitly converted to DATETIME.
SELECT DATEADD('2005-02-28 00:00:00', 1000000000, 'ff6');
-- Result: 2005-02-28 00:16:40
İlgili işlevler
DATEADD bir tarih işlevidir. Diğer tarih hesaplama ve dönüştürme işlevleri için bkz. Tarih işlevleri.