不带周末和公共假期的SQL DateDiff

Kaj*_*ama 3 t-sql date-range date-difference

我正在寻找解决方案,如何选择两个日期之间没有周末和公众假期的天数。

到目前为止,我有这个:

SELECT evnt.event_id,
       evnt.date_from,
       evnt.date_to,
       DATEDIFF(DD, evnt.date_from, evnt.date_to) 
       - (DATEDIFF(WK, evnt.date_from, evnt.date_to) * 2) 
       - CASE WHEN DATEPART(DW, evnt.date_from) = 1 THEN 1 ELSE 0 END 
       + CASE WHEN DATEPART(DW, evnt.date_to) = 1 THEN 1 ELSE 0 END AS Date_Diff
       --- COUNT(*) FROM public_holidays AS h WHERE h.date_from BETWEEN evnt.date_from AND evnt.date_to
       FROM events AS evnt
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我取消注释部分:

- COUNT(*) FROM public_holidays AS h WHERE h.date_from BETWEEN evnt.date_from AND evnt.date_to
Run Code Online (Sandbox Code Playgroud)

我想要实现的是在日期范围内获得工作日数。问题出在最后一步,我试图从该范围中减去所有公共假日。

谁能在最后一步提供帮助?看来,我做错了,但我不知道该怎么办。

先感谢您

小智 5

尝试这个:

SELECT evnt.event_id,
   evnt.date_from,
   evnt.date_to,
   DATEDIFF(DD, evnt.date_from, evnt.date_to) 
   - (DATEDIFF(WK, evnt.date_from, evnt.date_to) * 2) 
   - CASE WHEN DATEPART(DW, evnt.date_from) = 1 THEN 1 ELSE 0 END 
   + CASE WHEN DATEPART(DW, evnt.date_to) = 1 THEN 1 ELSE 0 END AS Date_Diff
   - (SELECT COUNT(*) FROM public_holidays AS h WHERE h.date_from BETWEEN evnt.date_from AND evnt.date_to)
   FROM events AS evnt
Run Code Online (Sandbox Code Playgroud)

取消注释应该是一个子查询

--- COUNT(*) FROM public_holidays AS h WHERE h.date_from BETWEEN evnt.date_from AND evnt.date_to
Run Code Online (Sandbox Code Playgroud)

像这样:

- (SELECT COUNT(*) FROM public_holidays AS h WHERE h.date_from BETWEEN evnt.date_from AND evnt.date_to)
Run Code Online (Sandbox Code Playgroud)