Sql Server 2008计算两个日期之间的夜晚,但删除31晚

Jul*_*nda 6 sql sql-server datediff sql-server-2008

我有一张预订表,其中包含以下信息:

BookingID,(唯一,非null)StartDate,(非null)EndDate(非null)

我需要计算一个人居住的夜晚,我可以在EndDate和StartDate之间使用DATEDIFF.但是,如果有人在31个月内整个月居住,我们只收取30.

我不确定如何在SQL中执行此操作.我以为我必须创建一个变量,按月计算并添加到变量,但这似乎很麻烦,需要很长时间,特别是在年底.这需要每天为大约5,000条记录完成.

所以:如果某人在2014年7月25日开始并于2014年2月9日结束,那么晚上的时间是38而不是39.如果有人在2014年2月2日开始并在2014年1月11日结束,那么晚上是30.有人在2014年2月10日开始,到2014年10月31日结束,晚上是29.

我们将计算未来,因此结束日期是否大于报告运行日期并不重要.

有没有人有任何想法如何以最好的方式实现这一目标?

Eri*_*icZ 0

我首先创建一个查找表,其中包含 31 天的所有月份

例如

DECLARE @month TABLE (start_date date,end_date date)

    INSERT INTO @month VALUES ('2014-07-01','2014-07-31'),('2014-08-01','2014-08-31'),('2014-10-01','2014-10-31'),('2014-12-01','2014-12-31') 
//populate all months in your calculate range
Run Code Online (Sandbox Code Playgroud)

然后你可以用以下方法计算该值

DECLARE @start DATE = '2014-07-25', @end DATE = '2014-09-02'

SELECT DATEDIFF(day,@start,@end) - 
    (SELECT COUNT(*) FROM @month WHERE start_date >= @start AND end_date <= @end)
Run Code Online (Sandbox Code Playgroud)