两个日期之间的SQL检查不返回任何结果
我有以下疑问-两个日期之间的SQL检查不返回任何结果,sql,sql-server,Sql,Sql Server,我有以下疑问- WITH get as ( SELECT * FROM ( SELECT patient, start, thru_dt, CAST(CONVERT(VARCHAR, DATEADD(DAY, -30, thru_dt), 112) AS DATE) as thru_dt_minus_30, cd, ROW_NUMBER() OVER (PARTITION BY patient ORDE
WITH get as
(
SELECT *
FROM
(
SELECT patient, start, thru_dt,
CAST(CONVERT(VARCHAR, DATEADD(DAY, -30, thru_dt), 112) AS DATE) as thru_dt_minus_30,
cd,
ROW_NUMBER() OVER (PARTITION BY patient ORDER BY thru_dt) AS row_rank
FROM mytable
where patient = '1861'
) a
WHERE row_rank = 1
AND cd = '30'
)
SELECT *
FROM get
LEFT JOIN tb1 ON get.patient = tb1.patient
LEFT JOIN tb2 ON get.patient = tb2.patient
LEFT JOIN tb3 ON get.patient = tb3.patient
LEFT JOIN tb4 ON get.patient = tb4.patient
LEFT JOIN tb5 ON get.patient = tb5.patient
LEFT JOIN tb6 ON get.patient = tb6.patient
WHERE thru_dt_minus_30 >= tb2.d1 AND thru_dt_minus_30 <= tb2.d2
预期产出
Patient thru_dt_minus30 tb2.d1 tb2.d2
1861 2020-01-30 2020-01-01 2020-01-31
我只期望输出中的第二行,因为
到
中的日期是tb2.d1
和tb2.d2
之间的唯一日期。考虑将WHERE
条件移动到ON
子句,以便在其他联接之前按时间过滤所需的结果集。此外,还要考虑<<代码> <代码>之间的代码紧凑性。
。。。
从[得到]
左连接tb1
在[get]上。患者=tb1。患者
左连接tb2
在[get]上。患者=tb2。患者
和[get]。通过tb2.d1和tb2.d2之间的_dt_减去_30
左连接tb3
在[get]上。患者=tb3。患者
左连接tb4
在[get]上。患者=tb4。患者
左连接tb5
在[get]上。患者=tb5。患者
左连接tb6
在[get]上。患者=tb6。患者
@DaleK已更新。它们是否使用日期数据类型或varchar存储?它们是日期。这就是为什么我要将通过
转换到一个日期。需要查看执行计划,以说明为什么它运行得如此缓慢。但是,有一个技巧可以很好地解决这个问题,它不是使用CTE,而是将CTE的输出存储到临时表中,然后针对临时表运行查询的第二部分。只有27行就可以了。我必须先将它转换为varchar,因为thru_dt在varchar中。如果我不投下它,并尝试在30天内投下,它会给我错误的结果。谢谢。这对我有用。“按时间过滤所需结果集”是什么意思?我的意思是过滤时间逻辑,([get]。通过tb2.d1和tb2.d2之间的-30
)在特定的连接上,而不是以WHERE
结尾。
Patient thru_dt_minus30 tb2.d1 tb2.d2
1861 2020-01-30 2020-01-01 2020-01-31