首页 > 解决方案 > 带有 CONVERT 的 WHERE 子句中带有 BETWEEN 的数据范围未过滤正确

问题描述

我正在使用下面的 SQL 请求来获取两个日期之间的信息。

但是结果包含超出我指定范围的记录。

查询

SELECT 
    CONVERT(VARCHAR, R.RN_EXECUTION_DATE, 103) AS 'Execution Date', 
    R.RN_TESTCYCL_ID, 
    R.RN_STATUS, 
    R.RN_RUN_NAME, 
    T.TS_USER_TEMPLATE_05, 
    RC.RCYC_NAME
FROM R 
    INNER JOIN TC 
        ON R.RN_TESTCYCL_ID = TC.TC_TESTCYCL_ID 
    INNER JOIN RC 
        ON RC.RCYC_ID = TC.TC_ASSIGN_RCYC 
    INNER JOIN T 
        ON R.RN_TEST_ID = T.TS_TEST_ID
WHERE R.RN_STATUS IN ('Passed', 'Failed')
    AND CONVERT(VARCHAR, R.RN_EXECUTION_DATE, 103) BETWEEN '16/11/2020' AND '28/02/2021'
    AND TC.CUSTOM_08 = 'IT5'
    AND (RC.RCYC_NAME LIKE '03_%TI-%' OR RC.RCYC_NAME LIKE 'SIT%')

结果

Execution Date | ... | ... |
22/12/2020     | ... | ... |
22/01/2021     | ... | ... |
19/06/2020     | ... | ... |
22/07/2020     | ... | ... |
...            | ... | ... |

数据类型

的数据类型RN_EXECUTION_TIMEvarchar

2018-04-04 00:00:00
2010-01-04 00:00:00
2020-12-10 00:00:00

我的查询中有任何错误吗?

预先感谢您的帮助

标签: sqlsql-servertsql

解决方案


AND CONVERT(VARCHAR, R.RN_EXECUTION_DATE, 103) BETWEEN '16/11/2020' AND '28/02/2021'

嗯?为什么要将日期转换为字符串以进行日期比较?只需使用日期比较。你可以做:

CONVERT(DATE, R.RN_EXECUTION_DATE) BETWEEN '2020-11-16' AND '2021-02-28'

但是,我根本不喜欢转换:

R.RN_EXECUTION_DATE >= '2020-11-16' AND
R.RN_EXECUTION_DATE < '2021-03-01'

请注意,通过摆脱BETWEEN,无论该列是否具有时间组件,这都有效。

编辑:

根据问题中的执行日期示例,您可以使用:

TRY_CONVERT(DATE, R.RN_EXECUTION_DATE) >= '2020-11-16' AND
TRY_CONVERT(DATE, R.RN_EXECUTION_DATE) < '2021-03-01'

推荐阅读