DATEDIFF ile Tarih Farkı: Gün, Ay, Yıl ve Yaş Hesabı
Beceri rehberi

DATEDIFF ile Tarih Farkı: Gün, Ay, Yıl ve Yaş Hesabı

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

DATEDIFF iki tarih arasında seçtiğiniz birimin kaç sınırının geçildiğini sayar; bu yüzden yıl ya da ay farkı çoğu zaman beklediğiniz "tam" değer değildir. Teslim süresi ve yaş gibi hesaplarda doğru sonuç, bu davranışı bilerek formül kurmaya bağlıdır.

Bir bakışta

  1. DATEDIFF başlangıç, bitiş ve birim argümanlarını alır. Birim olarak saniyeden yıla kadar değerlerden biri seçilir; sonuç tam sayıdır.
  2. Fonksiyon tam birim değil, geçilen sınırları sayar. Yılın son günü ile ertesi yılın ilk günü arasındaki yıl farkı bir çıkar, çünkü yıl sınırı geçilmiştir.
  3. Başlangıç bitişten büyükse sonuç negatiftir. Süre hesaplarında tarihlerin sırası önemlidir; ters yazılan tarih eksi işaretli değer üretir.
  4. Yaşı YEAR farkı olarak almak yanlıştır. Doğum günü henüz gelmediyse sonuç bir fazla çıkar; düzeltme için bu yılki doğum günü kontrol edilir.
  5. Ölçüde tarih sütununu doğrudan veremezsiniz. DATEDIFF tek bir tarih bekler; ölçüde MIN, MAX ya da bir yineleyici ile tek tarihe indirgemek gerekir.

DATEDIFF ne yapar?

DATEDIFF iki tarih arasındaki farkı seçtiğiniz birimde verir. Sözdizimi şöyledir:

DATEDIFF(<Başlangıç>, <Bitiş>, <Birim>)

Birim olarak SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER ya da YEAR yazılır. Birim tırnak içine alınmaz. Başlangıç ve bitiş argümanlarının ikisi de tek bir tarih değeri olmalıdır.

Sonuç, iki tarih arasındaki birim sınırlarının sayısıdır. Bitiş tarihi daha büyükse sonuç pozitif, başlangıç tarihi daha büyükse negatiftir. Bu yüzden başlangıcı önce, bitişi sonra yazmak süre hesaplarında standart alışkanlık olmalıdır.

Örnek olarak sipariş ile teslim arasındaki gün sayısını hesaplayan hesaplanmış sütun:

Teslim Süresi = DATEDIFF('Siparişler'[Sipariş Tarihi], 'Siparişler'[Teslim Tarihi], DAY)

Hesaplanmış sütunda her satır için ayrı değerlendirme yapıldığından sütunlar doğrudan kullanılabilir.

Tam birim değil, geçilen sınır sayılır

DATEDIFF'in en önemli özelliği, "kaç tam yıl" ya da "kaç tam ay" geçtiğini değil, kaç yıl ya da ay sınırının aşıldığını saymasıdır. Microsoft belgesi sonucu bu şekilde tanımlar: iki tarih arasındaki birim sınırlarının sayısı.

Bunun sonuçları şunlardır. Yılın son günü ile ertesi yılın ilk günü arasında yalnızca bir gün vardır, ama yıl sınırı geçildiği için YEAR farkı bir çıkar. Ayın son günü ile ertesi ayın ilk günü arasındaki MONTH farkı da bir çıkar. Aynı yıl içinde iki tarihte YEAR farkı sıfırdır; araları ne kadar uzak olursa olsun yıl sınırı geçilmemiştir.

Saat bileşeni olmayan tarihlerde gün farkı sorun yaratmaz, çünkü günün sınırı gece yarısıdır ve iki tarih arasındaki gün sayısı sezgisel sonucu verir. Sorun ay ve yıl hesaplarında ortaya çıkar. "Yaklaşık kıdem" gibi kabaca bir değer yeterliyse DATEDIFF doğrudan işe yarar; "tam yıl" gerekiyorsa sonucun düzeltilmesi gerekir.

Ölçüde kullanım: tek tarihe indirgemek

Hesaplanmış sütunda satır bağlamı olduğu için sütun adı yeterlidir. Ölçüde ise satır bağlamı yoktur ve DATEDIFF tek bir tarih bekler. Sütunu doğrudan vermek hata üretir. Bunun yolları şunlardır.

Birincisi, tarihleri MIN ya da MAX ile tek değere indirgemektir. Bir projenin toplam süresi için:

Proje Süresi = DATEDIFF(MIN('Görevler'[Başlangıç]), MAX('Görevler'[Bitiş]), DAY)

İkincisi, bir yineleyici kullanıp her satırın farkını ayrı hesaplamaktır. Ortalama teslim süresi için:

Ortalama Teslim Süresi = AVERAGEX('Siparişler', DATEDIFF('Siparişler'[Sipariş Tarihi], 'Siparişler'[Teslim Tarihi], DAY))

AVERAGEX tabloyu satır satır dolaşır, her satırın DATEDIFF sonucunu hesaplar ve ortalamasını alır. Henüz teslim edilmemiş siparişlerin teslim tarihi boştur; bu satırları hesaba katmak istemiyorsanız yineleyiciye yalnız teslim tarihi dolu satırları verin:

Ortalama Teslim Süresi (Teslim Edilenler) = AVERAGEX(FILTER('Siparişler', NOT ISBLANK('Siparişler'[Teslim Tarihi])), DATEDIFF('Siparişler'[Sipariş Tarihi], 'Siparişler'[Teslim Tarihi], DAY))

Açık siparişin bekleme süresi için bitiş yerine TODAY() kullanılır; fonksiyon her hesaplandığında güncel tarihi verir.

Yaş hesabı: sınır sayma düzeltmesi

Yaşı DATEDIFF(DoğumTarihi, TODAY(), YEAR) ile hesaplarsanız, doğum günü henüz gelmemiş kişilerde bir fazla çıkar. Nedeni, yıl sınırının doğum gününe bakmadan yılbaşında geçilmiş sayılmasıdır.

Doğru yaş için bu yılki doğum gününün bugünden sonra olup olmadığına bakılır ve öyleyse sonuçtan bir çıkarılır:

Yaş = VAR Bugun = TODAY() VAR Dogum = 'Kişiler'[Doğum Tarihi] VAR YilFarki = DATEDIFF(Dogum, Bugun, YEAR) VAR BuYilkiDogumGunu = DATE(YEAR(Bugun), MONTH(Dogum), DAY(Dogum)) RETURN YilFarki - IF(BuYilkiDogumGunu > Bugun, 1, 0)

Değişken adlarında Türkçe karakter kullanılmaz; DAX değişken adlarında yalnız a-z, A-Z harflerini ve rakamları kabul eder. Aynı mantık tam ay için de geçerlidir. Gün farkı bir ayın ilgili gününe ulaşmadıysa MONTH farkından bir çıkarmak gerekir. Kıdem, abonelik süresi ve vade gibi hesaplarda tam birim istenip istenmediğini baştan netleştirin; birçok raporda kabaca değer yeterli olabilir, ama yaş gibi eşik içeren hesaplar kesin değer ister.

Kıdem, vade ve gecikme örnekleri

Aynı kalıp, tarih farkı gerektiren diğer raporlarda da kullanılır. Çalışanın işe giriş tarihinden bugüne kıdemi, kabaca değer yeterliyse ay cinsinden doğrudan hesaplanır:

Kıdem (Ay) = DATEDIFF('Çalışanlar'[İşe Giriş], TODAY(), MONTH)

Faturanın vade tarihine göre gecikme günü, vadesi gelmemiş faturalarda eksi değer vermesin diye sıfırın altına inmeyecek şekilde yazılır:

Gecikme Günü = MAX(0, DATEDIFF('Faturalar'[Vade Tarihi], TODAY(), DAY))

İş süreçlerinde döngü süresi, yani bir talebin açılışından kapanışına geçen süre de aynı biçimdedir. Kapanmamış taleplerde kapanış tarihi boş olduğundan ölçüyü ya kapanmışlarla sınırlandırın ya da bitiş yerine bugünü koyarak "şu ana kadar geçen süre" olarak etiketleyin. Bu iki anlam farklıdır ve aynı ölçü adıyla gösterilmemelidir.

Hesapların hepsinde önce hangi sorunun yanıtlandığını netleştirin: sürenin tamamlandığı mı, hâlâ sürüp sürmediği mi. Doğru birim ve doğru bitiş tarihi bu karara bağlıdır.

Sık hatalar ve doğruları

Sık görülen DATEDIFF hataları birkaç kaynaktan gelir: sınır saymayı unutmak, tarihleri ters yazmak ve boş tarihleri korumamak.

Tarihlerin sırası değiştiğinde sonuç işaret değiştirir. Teslim süresi raporunda eksi değerler görüyorsanız ya argümanlar ters yazılmıştır ya da veride teslim tarihi sipariş tarihinden önce girilmiştir; ikincisi bir veri kalitesi sorunudur ve kaynağında düzeltilmelidir.

Boş tarihler de beklenmedik sonuçlara yol açabilir. Başlangıç ya da bitiş boş olabilecek her alanda hesaplamadan önce ISBLANK ile kontrol edin: hesaplanmış sütunda IF ile, ölçüde boş satırları FILTER ile dışarıda bırakarak.

Son olarak, saat bileşeni içeren tarih-saat değerlerinde DAY farkı ile HOUR farkının farklı beklentilere cevap verdiğini unutmayın. Birimi, raporda okuyanın beklediği ölçüye göre seçin.

Şekil 1

Sık tarih farkı hataları birkaç düzeltmeyle çözülür

Sık hatalar ve doğruları

Sık yapılan
Doğrusu
Yaşı doğrudan YEAR farkıyla almak
Doğum günü gelmediyse bir çıkarmak
Başlangıç ve bitiş tarihini ters yazmak
Başlangıcı önce, bitişi sonra yazmak
Boş teslim tarihini korumadan hesaplamak
ISBLANK ile önceden kontrol etmek
Ölçüde tarih sütununu doğrudan vermek
MIN, MAX ya da AVERAGEX ile tek tarihe indirgemek
Kaynak: Microsoft Learn: DATEDIFF function (DAX); düzeltmeler sayfa içeriğiMindset Institute

Bu beceriyi Mindset programlarında nerede çalışırsınız?

Uygulamalı Power BI ile Veri Analitiği ve Görselleştirme Sertifika Programı, DAX analiz dili ve kullanımı ile veri modelleme ve yönetimi başlıklarında ölçü yazımının temelini verir. Power BI İleri Düzey ve DAX programında zaman zekası ve dönem analizi ayrı bir başlıktır. Teslim süresi, kıdem ve vade raporları hazırlayan analistler bu kalıpları sık kullanır.

İlgili Mindset programı

Uygulamalı Power BI ile Veri Analitiği ve Görselleştirme Sertifika Programı

Sık sorulanlar

Sık sorulan sorular

DATEDIFF ile iş günü hesaplanır mı?

Doğrudan hayır; DAY birimi hafta sonlarını da sayar. İş günü için tarih tablonuza iş günü olup olmadığını gösteren bir sütun eklenir ve iki tarih arasındaki iş günü olan satırlar sayılır. Resmî tatil bilgisini bu tabloya sizin eklemeniz gerekir.

Saat ve dakika farkı nasıl alınır?

Tarih-saat değerlerinde birim olarak HOUR ya da MINUTE yazılır. Burada da fonksiyon sınır saydığı için, kısa süreler arasında yalnızca saat sınırı geçilmişse sonuç beklenenden farklı çıkabilir. Hassas süre için daha küçük birimi kullanıp sonucu dönüştürmek daha güvenlidir.

Hesaplanmış sütun mu, ölçü mü yazmalıyım?

Her satırın farkına ihtiyaç varsa ve sonuç sabit kalacaksa hesaplanmış sütun uygundur. Toplu sonuç gerekiyorsa, örneğin ortalama teslim süresi, ölçü yazın. Ölçüde satırlar arasında dolaşmak için AVERAGEX gibi bir yineleyici kullanılır.

TODAY ile hesaplanan fark neden değişiyor?

TODAY fonksiyonu her hesaplandığında o günün tarihini verir. Bu yüzden bekleme süresi ya da yaş gibi değerler her yenilemede güncellenir. Raporun belirli bir tarihteki durumunu sabitlemek istiyorsanız TODAY yerine rapor tarihini tutan ayrı bir tarih değeri kullanın.

Kalan gün sayısı için başlangıç ve bitişi nasıl yazarım?

Başlangıç olarak bugünü, bitiş olarak son tarihi yazın: DATEDIFF(TODAY(), [Son Tarih], DAY). Son tarih geçmişse sonuç negatif çıkar; bunu gecikme göstergesi olarak kullanabilirsiniz ya da negatif değerleri sıfırlayan bir koşul ekleyebilirsiniz.

DAX DATEDIFF: Power BI’da İki Tarih Arası Fark Hesaplama