2016-01-08 87 views
2

我需要计算到期日期。应该很容易吧?那么,我的“寿命”是几年而不是几天,并且为了使它更具挑战性,这些年份的价值可能是分数。这里是我开始有:如何计算SQL Server中的到期日期?

set @ExpirationDate = DATEADD(year, @LifeSpanYears, @BeginDate) 

的问题是,DATEADD允许小数传递的,但如果你阅读文档,小数被截断为int。

如何计算分数年的到期日期?

回答

3

这是我想出了答案:

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 

注:当我在做这个,我意识到,这是不可能确定使用分数年作为生命周期的确切截止日期。你怎么知道什么时候增加闰日?如果你真的想要确切的答案,你需要几天的寿命。

1

实际上,“年限寿命”可能是几个月的寿命。如果是这样,你可以考虑:

return dateadd(month, round(@LIfeSpanYears * 12, 0), @BeginDate) 

这处理闰年的问题。但是,它的代价只有几个月才能解决。

+0

你知道我还能做什么吗?我可以分开LifeSpanYears的整数和小数部分。使用我的答案添加小数天数,然后添加处理闰年的整数年数。答案仍然不确定,因为我甚至不知道答案*应该是什么。 :) – Jess

+1

@Jess。 。 。那将接近。它不会处理日子跨过闰年边界的情况,但最多只能在一天内关闭。 –