最近的项目中的一项要求是报告何时将完全消耗资源。除了用尽日历日期外,还要求我用英语形式显示剩余时间,例如“要走1年3个月”。
内置DATEDIFF
功能
返回在指定开始日期和结束日期之间跨越的指定日期部分边界的计数...。
如果按原样使用,可能会产生误导性或令人困惑的结果。例如,使用YEAR间隔将显示1999-12-31(YYYY-MM-DD)和2000-01-01相隔一年,而常识会说这些日期仅相隔1天。相反,使用1999年12月31日和2010年12月31日之间的时间间隔为4018天,而大多数人会以“ 11年”作为更好的描述。
从天数开始,然后从中计算月份和年份,将容易出现and年和月份大小错误。
我想知道如何在各种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,但是我很想了解其他方言将如何处理此问题。