You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:45:19