Yakın tarihli bir projedeki bir gereklilik, bir kaynağın ne zaman tamamen tüketileceğini bildirmektir. Tükenme takvimi tarihinin yanı sıra, kalan süreyi "1 yıl, 3 ay sürecek" gibi İngilizce biçiminde göstermem istendi.
Yerleşik DATEDIFF
işlev
Belirtilen başlangıç tarihi ile bitiş tarihi arasında geçen belirtilen tarih bölümü sınırlarının sayısını ... döndürür.
Olduğu gibi kullanılırsa, bu yanıltıcı veya kafa karıştırıcı sonuçlar doğurabilir. Örneğin, YEAR aralığının kullanılması 1999-12-31 (YYYY-AA-GG) ve 2000-01-01 yıllarını bir yıl arayla gösterirken, sağduyu bu tarihlerin sadece 1 günle ayrıldığını söyler. Buna karşılık 1999-12-31 ve 2010-12-31 GÜN aralığını kullanmak 4.018 günle ayrılırken, çoğu insan "11 yıl" ı daha iyi bir tanım olarak görür.
Gün sayısından başlayarak ve ayları ve yıllarını oradan hesaplamak artık yıl ve ay büyüklüğü hatalarına eğilimli olacaktır.
Bunun çeşitli SQL lehçelerinde nasıl uygulanabileceğini merak etmeliyim? Örnek çıktı şunları içerir:
create table TestData(
FromDate date not null,
ToDate date not null,
ExpectedResult varchar(100) not null); -- exact formatting is unimportant
insert TestData (FromDate, ToDate, ExpectedResult)
values ('1999-12-31', '1999-12-31', '0 days'),
('1999-12-31', '2000-01-01', '1 day'),
('2000-01-01', '2000-02-01', '1 month'),
('2000-02-01', '2000-03-01', '1 month'), -- month length not important
('2000-01-28', '2000-02-29', '1 month, 1 day'), -- leap years to be accounted for
('2000-01-01', '2000-12-31', '11 months, 30 days'),
('2000-02-28', '2000-03-01', '2 days'),
('2001-02-28', '2001-03-01', '1 day'), -- not a leap year
('2000-01-01', '2001-01-01', '1 year'),
('2000-01-01', '2011-01-01', '11 years'),
('9999-12-30', '9999-12-31', '1 day'), -- catch overflow in date calculations
('1900-01-01', '9999-12-31', '8099 years 11 months 30 days'); -- min(date) to max(date)
SQL Server 2008R2 kullanıyorum ama diğer lehçelerin bunu nasıl ele alacağını öğrenmek istiyorum.