【问题标题】:SQL how to exclude bank Holiday and Christmas DAY on Date diffSQL如何在日期差异上排除银行假日和圣诞节
【发布时间】:2018-06-30 10:15:24
【问题描述】:

我们将不胜感激任何建议 如何在英国日期 datediff 中排除银行假日、圣诞节

我有一个客户表,其中包含所有在酒店预订的客户,我想计算逗留时间,但我想排除英国的银行假期和其他假期。

非常感谢

SELECT  [StartDate],
DATEDIFF(DAY,[StartDate],[EndDate]) AS Bookingdays    
      ,[EndDate]
      ,[CustomerId]
      ,[BookingID]
  FROM [CustomerBooking]

【问题讨论】:

  • 搜索日历表。
  • 阐述 Dan Guzman 的评论:(1) 创建日历表。 (2) 在日历表中标记独特的日子。 (3) 从日历表中选择[StartDate] 和[EndDate] 之间的日期,并且唯一日期的列不在(银行假期,圣诞节)。 - 这是通过您的表和日历表之间的简单 JOIN 完成的
  • 嗨 Ronen,非常感谢,只是想知道加入日历表是否需要同时连接到 [CustomerBooking] 表上的 StartDate 和 EndDate?这是在进行左连接时...

标签: sql-server tsql date-difference


【解决方案1】:

要实现这一点,您需要一个 HolidayCalendar 表,其中将列出所有假期日期和圣诞节。

使用该日历表过滤您的预订日期WHERE StartDate NOT IN (SELECT HolidayDate from HolidayCalendar) OR EndDate NOT IN (SELECT HolidayDate from HolidayCalendar)

您可以使用 JOINS 或 CTE 以更优化的查询通过其他多种方式过滤您的日期。上面的代码只是一个例子。

【讨论】:

  • DateBetweenStartDateAndEndDate NOT IN (SELECT HolidayDate from HolidayCalendar) 呢?
  • 当使用 NOT IN 时,左侧操作数应该只有一个值。即 DateBetweenStartDateAndEndDate 应该只返回一个日期。如果在您的情况下,它将始终返回单个值,那么您绝对可以使用它。
  • 嗨,Prateek,非常感谢,只是想知道加入日历表是否需要同时连接到 [CustomerBooking] 表上的 StartDate 和 EndDate?这是在进行左连接时...
  • 据我所知,如果预订范围是从 1 日到 3 日,那么您需要过滤属于该范围的所有日期,即 1 日、2 日和 3 日。如果是这种情况,那么逻辑将很复杂,因为您需要一个包含所有预订日期的 CTE 或中间表,并将连接日历表应用于所有这些预订日期(不仅是开始日期和结束日期)。如果不是这种情况,并且预订范围最多为 2 天,即第 1 天和第 2 天,那么是的,您将需要在开始日期和结束日期加入日历表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多