您如何计算 SQL 服务器中的到期日期?
How do you calculate an expiration date in SQL Server?
我需要计算到期日期。应该很容易吧?好吧,我的 "lifespan" 是以年而不是天为单位的,为了让它更具挑战性,年的值可以是小数。这是我的开头:
set @ExpirationDate = DATEADD(year, @LifeSpanYears, @BeginDate)
问题是,DATEADD允许传入小数,但如果你阅读文档,小数被截断为整数。
如何计算带小数年份的到期日期?
这是我想出的答案:
create function Reporting.CalcExpirationDate ( @LifeSpanYears decimal(9,2), @BeginDate date)
returns date
begin
return DATEADD(day, (@LifeSpanYears * 365.25), @BeginDate)
end
然后像这样使用它:
select Reporting.CalcExpirationDate (13 , '2015-09-01') as CalculatedDate, '2028-09-01' as ExpectedDate
union all select Reporting.CalcExpirationDate (13.5 , '2015-09-01') as CalculatedDate, '2029-03-01' as ExpectedDate
注意:当我在做这件事时,我意识到不可能使用小数年作为生命周期来确定确切的到期日期。你怎么知道什么时候添加闰日?如果你真的想要确切的答案,你需要以天为单位的生命周期。
实际上,"lifespan in years" 可能是以月为单位的寿命。如果是这样,您可能会考虑:
return dateadd(month, round(@LIfeSpanYears * 12, 0), @BeginDate)
这处理了闰年的问题。然而,它的代价是只解决了几个月。
我需要计算到期日期。应该很容易吧?好吧,我的 "lifespan" 是以年而不是天为单位的,为了让它更具挑战性,年的值可以是小数。这是我的开头:
set @ExpirationDate = DATEADD(year, @LifeSpanYears, @BeginDate)
问题是,DATEADD允许传入小数,但如果你阅读文档,小数被截断为整数。
如何计算带小数年份的到期日期?
这是我想出的答案:
create function Reporting.CalcExpirationDate ( @LifeSpanYears decimal(9,2), @BeginDate date)
returns date
begin
return DATEADD(day, (@LifeSpanYears * 365.25), @BeginDate)
end
然后像这样使用它:
select Reporting.CalcExpirationDate (13 , '2015-09-01') as CalculatedDate, '2028-09-01' as ExpectedDate
union all select Reporting.CalcExpirationDate (13.5 , '2015-09-01') as CalculatedDate, '2029-03-01' as ExpectedDate
注意:当我在做这件事时,我意识到不可能使用小数年作为生命周期来确定确切的到期日期。你怎么知道什么时候添加闰日?如果你真的想要确切的答案,你需要以天为单位的生命周期。
实际上,"lifespan in years" 可能是以月为单位的寿命。如果是这样,您可能会考虑:
return dateadd(month, round(@LIfeSpanYears * 12, 0), @BeginDate)
这处理了闰年的问题。然而,它的代价是只解决了几个月。