Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个日期之间的SQL检查不返回任何结果_Sql_Sql Server - Fatal编程技术网

两个日期之间的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