如何实现SQL查询按工作日自动切换预约数据拉取日期?
解决方案
你的思路是正确的,只需要把CASE逻辑转换成SQL支持的条件分支即可,以下是实现完全自动化的查询代码:
SELECT [a bunch of demographic and appointment-related fields] FROM Demographics d JOIN ApptInfo ai ON d.PatientID = ai.PatientID WHERE -- 周一运行时,拉取上周五和周六的所有预约数据 (DATEPART(WEEKDAY, GETDATE()) = 2 AND ai.ApptDate >= DATEADD(dd, DATEDIFF(dd, 0, GETDATE()) - 3, 0) AND ai.ApptDate < DATEADD(dd, DATEDIFF(dd, 0, GETDATE()) - 1, 0)) -- 非周一运行时,拉取前一个工作日(昨天)的预约数据 OR (DATEPART(WEEKDAY, GETDATE()) != 2 AND ai.ApptDate >= DATEADD(dd, DATEDIFF(dd, 1, GETDATE()), 0) AND ai.ApptDate < DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0))
说明:
- 使用
DATEPART(WEEKDAY, GETDATE()) = 2判断当前是否为周一(SQL Server默认周日为1,周一为2),相比DATENAME更不受服务器语言设置影响,兼容性更强。 - 周一的日期范围:
DATEADD(dd, DATEDIFF(dd, 0, GETDATE()) - 3, 0)是周一当天往前推3天的0点(即上周五的起始时间),DATEADD(dd, DATEDIFF(dd, 0, GETDATE()) - 1, 0)是周一当天往前推1天的0点(即周日的起始时间),这样就包含了周五全天和周六全天的所有预约。 - 非周一的逻辑和你原查询一致,取昨天0点到今天0点的预约数据,确保只拉取前一个工作日的记录。
如果你的SQL Server设置中周一为一周的第一天(可通过SET DATEFIRST 1修改),则DATEPART(WEEKDAY, GETDATE()) = 1表示周一,只需对应调整判断条件即可。
内容的提问来源于stack exchange,提问作者EJF
相关产品推荐
相关产品推荐

