如何计算两个日期之间的天数

时间:2015-06-01 15:41:09

标签: sql sql-server sql-server-2008

我想构建一个计算两个日期之间天数的标量函数:

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天 提前谢谢

1 个答案:

答案 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,但这是正确的。

SQL小提琴:http://sqlfiddle.com/#!6/9eecb/5791/0

相关问题