我正在处理一个SQL查询,该查询提取在给定日期在诊所预约的每个人的结果.对于前一个工作日发生的所有约会,我每天都会运行此查询.该查询非常基本:

SELECT
[a bunch of demographic and appointment-related fields]

FROM Demographics d JOIN ApptInfo ai ON d.PatientID = ai.PatientID

WHERE (ai.ApptDate >= DATEADD(dd,DATEDIFF(dd,1,GETDATE()),0)
      AND ai.ApptDate < DATEADD(dd,DATEDIFF(dd,0,GETDATE()),0))

到目前为止,这个方法运行得很好,除非我在星期一运行查询.在这种情况下,我需要能够调出前一个星期五100星期六的所有结果,因为诊所在星期六也开放半天.显然,我不能只看前一天的比赛,因为那天是星期天.

我可以在脑海中很清楚地看到我想要做的事情的逻辑,但我不确定具体如何设置它.它需要是这样的东西:

WHERE
    (CASE
        WHEN DATENAME(WEEKDAY, GETDATE()) = 'Monday' THEN [pull results where ApptDate is 3 days ago OR 2 days ago]
        ELSE [the same code shown above that pulls the previous day]
     END)

我是在正确的轨道上吗?当然,另一种 Select 是手动输入我想要查看的任何日期,但如果能够每天运行这个查询并使其完全自动化,即使是在星期一,那也是非常棒的.

推荐答案

老实说,为了可读性,日期上升参数很可能是better.不过,你仍然可以在同一批中完成这项工作.

我使用了一种有点"绕来绕go "的方法(参见answerxGreg Hewgill)来判断哪一天是工作日,因为我想确保给出的结果与语言/DATEFIRST设置的regardless相同:

DECLARE @DateFrom date = CASE (DATEPART(WEEKDAY,GETDATE()) + @@DATEFIRST + 5) % 7 + 1 WHEN 1 THEN DATEADD(DAY, -3,GETDATE()) ELSE DATEADD(DAY, -1,GETDATE()) END,
        @Dateto date = GETDATE(); --Considering there is no data on a Sunday, this is "fine"

--SELECT @DateFrom, @Dateto

SELECT [a bunch of demographic and appointment-related fields]
FROM dbo.Demographics D
     JOIN dbo.ApptInfo AI ON D.PatientID = AI.PatientID
WHERE AI.ApptDate >= @DateFrom
  AND AI.ApptDate < @Dateto;

如果您"必须"在没有变量的情况下完成它,那么它将如下所示:

SELECT [a bunch of demographic and appointment-related fields]
FROM dbo.Demographics D
     JOIN dbo.ApptInfo AI ON D.PatientID = AI.PatientID
WHERE AI.ApptDate >= CONVERT(date,CASE (DATEPART(WEEKDAY,GETDATE()) + @@DATEFIRST + 5) % 7 + 1 WHEN 1 THEN DATEADD(DAY, -3,GETDATE())
                                                                                                ELSE DATEADD(DAY, -1,GETDATE())
                                  END)
  AND AI.ApptDate < CONVERT(date,GETDATE());

Sql相关问答推荐

使用交叉应用透视表在SQL中转换分段时间段&

SUM(条件)在Oracle?

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

Postgres JSONB对象筛选

SQL -滞后于上一个非重复值

如何在presto/SQL中使用两个数组列创建(分解)单独的行

从列中提取子字符串的ORDER BY CASE语句

重用传递给 node 的参数-postgres upsert查询

在SQL GROUP BY中的某些行之后执行计算

我可以在SQLite3中使用BLOB作为主键吗?

VS代码无法识别SQL代码中带括号的字符串

按二维数组的第一个元素排序

SAS proc freq 或 proc sql 获取数据子集和整个数据的频率

SQL Server中使用min()和max()从选定的特定值id表中删除不必要的时间

在where语句中使用CTE非常缓慢

正则表达式:停在第一个匹配的其中一个字符位置上

Django only() 和 values() 不适用于 prefetch_related()

存储过程 - 动态 SQL 中不同列值的计数

SQLite 中的过滤运行总和视图