最近のプロジェクトの要件は、リソースが完全に消費される時期を報告することでした。枯渇カレンダーの日付だけでなく、残り時間を「1年3か月」のように英語のような形式で表示するように求められました。
組み込みDATEDIFF
関数
指定された開始日と終了日の間で交差する指定された日付部分の境界の数...を返します。
そのまま使用すると、誤解を招く、または紛らわしい結果が生じる可能性があります。たとえば、YEARの間隔を使用すると、1999-12-31(YYYY-MM-DD)と2000-01-01が1年離れていることが示されますが、これらの日付は1日だけ離れていると常識的に考えられます。逆に、DAY 1999-12-31と2010-12-31の間隔を使用すると、4,018日で区切られますが、ほとんどの人は「11年」をより適切に説明します。
日数から開始して、そこから月と年を計算すると、うるう年と月のサイズのエラーが発生しやすくなります。
これをさまざまなSQL方言でどのように実装できるのか疑問に思いました。出力例は次のとおりです。
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を使用していますが、他の方言がこれをどのように処理するかを知りたいです。