Bu iki özellikte MS SQL Server 2022 ile birlikte gelen fonksiyonlardır. DATE_TRUNC, tarih ve zaman verilerini belirli bir zaman birimine kesmek için kullanılan yeni bir araçtır. Eski yöntemlerle kıyaslandığında, çok daha basit ve anlaşılır bir yapı sunar. Eskiden karmaşık CAST, FLOOR gibi fonksiyonlarla yapmamız gereken işlemler artık DATE_TRUNC ile tek satırda kolayca yapılabiliyor.
DATE_TRUNC, belirttiğimiz zaman birimine göre bir tarih veya zaman verisini yuvarlayarak döndürür. Örneğin, bir tarih-saat bilgisini gün, ay ya da yıl seviyesine yuvarlayabiliriz. Bu fonksiyon sayesinde zaman bazlı analizleri daha hızlı ve temiz bir şekilde yapabiliyoruz. Kullanım şekli ise;
DATE_TRUNC (datePart, date)
- datePart: Yuvarlamak istediğiniz zaman birimi (örneğin, 'year', 'month', 'day').
- date: İşlem yapılacak tarih veya zaman değeri.
Örnekler;
DATE_TRUNC ile bir tarihi yıl seviyesine yuvarlama:
SELECT DATE_TRUNC(year, '2024-09-07 15:30:45');
Not: Bu sorgu, verilen tarih-saat bilgisini yıl seviyesine yuvarlar. Yani 2024 yılının başlangıcı olan 1 Ocak 2024, saat 00:00:00 döndürülür. Yani yılın başından itibaren kaç gün kaç saat olduğunu hesaplama şansı bulabiliriz.
DATE_TRUNC ile saat seviyesine yuvarlama:
SELECT DATE_TRUNC(hour, '2024-09-07 15:30:45');
Not: Bu örnek, verilen tarih-saat bilgisini saat seviyesine yuvarlayarak tam saat değerini döndürür.
DATE_BUCKET, sayesinde eskiden kullandığımız DATEPART ve DATANAME gibi fonksiyonlardan sıyrılıp daha efektif ve daha az karmaşık SQL sorguları oluşturma şansı bulduk. DATE_BUCKET fonksiyonu tarih verilerini belirli aralıklara bölmek amacıyla kullanılır. Kullanım şekli ise;
DATE_BUCKET (datePart , number , date , origin)
- datePart: Gruplamak istediğiniz zaman birimini belirtin. (örneğin: year, month, day).
- number *: Bucket aralığının boyutunu belirleyin (örneğin, 1 yıl, 3 ay, vb.).
- date: Üzerinde işlem yapılacak tarih sütununu belirtin.
- origin: Başlangıç tarihini girin. (Eğer bir giriş yapmazsanız origin sabit olarak 1900-01-01 00:00:00.000 değerini alır.)
* Eğer number değerimiz bir sayısal (integer) değerinin alabileceğinden daha büyük bir sayı olursa veya negatif bir sayısal değer olursa hata döndürür.
Kullanım Amaçları Ve Yerleri:
- Verileri haftalık, aylık ya da yıllık periyotlar şeklinde gruplamak amacıyla,
- Zaman serisi verilerinin trend analizini yapmak amacıyla.
- Zaman aralıklarına göre raporlar oluşturmak (örneğin, her ay kaç sipariş yapıldığını görmek gibi),
- Kullanılan yerleri daha çok örneklerde inceleyebilirsiniz.
Örnekler;
DATE_BUCKET ile hafta başlarının hangi gün ile başladığını görebilirsiniz:
DECLARE @date DATETIME2 = '2020-04-15 21:22:11’;
SELECT DATE_BUCKET(WEEK, 1, @date);
Not: 2020-04-13 çıkar çünkü 2020 nisan ayının bu 15 ine yakın ama 15 ini geçmeyen haftanın başlangıç tarih 13 üdür.
DATE_BUCKET kullanarak haftalara göre gruplama:
SELECT DATE_BUCKET(MONTH,1, event_date) as BUCKET,
COUNT(*) daysInMonth FROM sample_data
GROUP BY DATE_BUCKET(MONTH,1, event_date)
Not: sample_date tablosundan gelen event_date sütununda bulunan tarihlerin aylarını 1’er aylık periyotlara bölüp daha sonra bunları grupladık.
DATE_BUCKET ile siparişleri 2 haftalık aralıklara bölmek:
DECLARE @DATE DATETIME2 = '2020-04-15 21:22:11'; SELECT DATE_BUCKET(WEEK, 2, @DATE);
Not: Verilen tarihi içeren en yakın 2 haftalık dilimi bulmayı sağladı.