带截止时间的DATEDIFF



我正在做一个房间调度应用程序。我们有这个退房规则,我们需要遵守。所有退房时间应该是中午12点。如果退房日期在下午12点之后,将被视为额外1天。

下面是我的T-SQL代码,返回5天。

  SELECT DATEDIFF(day, '3/12/2013 12:00:00 PM', '3/17/2013 3:00:00 PM'); 

如果您看到上面的代码,则结束日期是下午3:00:00。我如何调整这段代码返回6天而不是5天?

如果我有这个代码呢?

  SELECT CEILING(DATEDIFF(SECOND, '3/12/2013 02:00:00 PM' , '3/17/2013 12:50:36 PM') / (24.0 * 60 * 60))

上面的代码仍然返回5天而不是6天。

SELECT CEILING(DATEDIFF(SECOND, '3/12/2013 12:00:00 PM', '3/17/2013 12:00:01 PM') / (24.0 * 60 * 60))

正确的方法是在StartDate和EndDate中减去12小时,然后取day-diff + 1:

declare @dateStart as datetime, @dateEnd as datetime
set @dateStart = cast('20130301 11:59:59 AM' as datetime)
set @dateEnd   = cast('20130301 12:01:01 PM' as datetime)
select 
  @dateStart, 
  @dateEnd
select days = 1 + datediff(d,@dateStart,@dateEnd)
select 
  days = 1 + datediff(d, dateadd(hh, -12, @dateStart), dateadd(hh, -12, @dateEnd))

返回:

----------------------- -----------------------
2013-03-01 11:59:59.000 2013-03-01 12:01:01.000
days
-----------
1
days
-----------
2

显然第二个公式是正确的,而不是第一个。

也许你可以计算小时数:

SELECT DATEDIFF(hour, '3/12/2013 12:00:00 PM', '3/17/2013 3:00:00 PM'); 

因此,123 > 120(或除以24 - 5.125 > 5)占6天。

最新更新