我想构建一个计算两个日期之间天数的标量函数:
all month=30 days
1 year =360 days
the two dates are add to calculation
一些迹象
select DATEDIFF(DAY,'20/03/2014','01/02/2015')
我测试了
Select datediff(month, '01/02/2014', '28/02/2014') * 30 - (DATEPART(day,'01/02/2014') - datepart(day, '28/02/2014'))
但结果是= 318,这对我来说是错误的(正确的结果是312)
我也测试了
{{1}}
,结果是28,这是假的,因为结果应该是30天 提前谢谢
答案 0 :(得分:3)
这将为您提供360天日历的日期:
独家日期范围:
if datepart(day, @date2) = datepart(day,dateadd(day, -1,(Cast(Cast(datepart(year, @date2) as varchar) + '-' + Cast(datepart(month, @date2) + 1 as varchar) + '-01' as date))))
begin
Select datediff(month, @date1, @date2) * 30 - (DATEPART(day, @date1) - 30)
end
else if datepart(day, @date1) = datepart(day,dateadd(day, -1,(Cast(Cast(datepart(year, @date1) as varchar) + '-' + Cast(datepart(month, @date1) + 1 as varchar) + '-01' as date))))
begin
Select datediff(month, @date1, @date2) * 30 - (30 - datepart(day, @date2))
end
else
begin
Select datediff(month, @date1, @date2) * 30 - (DATEPART(day, @date1) - datepart(day, @date2))
end
包含日期范围:
if datepart(day, @date2) = datepart(day,dateadd(day, -1,(Cast(Cast(datepart(year, @date2) as varchar) + '-' + Cast(datepart(month, @date2) + 1 as varchar) + '-01' as date))))
begin
Select datediff(month, @date1, @date2) * 30 - (DATEPART(day, @date1) - 30) + 1
end
else if datepart(day, @date1) = datepart(day,dateadd(day, -1,(Cast(Cast(datepart(year, @date1) as varchar) + '-' + Cast(datepart(month, @date1) + 1 as varchar) + '-01' as date))))
begin
Select datediff(month, @date1, @date2) * 30 - (30 - datepart(day, @date2)) + 1
end
else
begin
Select datediff(month, @date1, @date2) * 30 - (DATEPART(day, @date1) - datepart(day, @date2)) + 1
end
If检查其中一个日期是否是该月的最后一天。如果他们是,那么他们将其视为30日,因为每个月需要30天。
它计算月数,乘以30,然后计算此后的天数差异。
如果你今年和年份一起运行,它将给出360,如果你使用你的例子它会给出311,但这是正确的。