sql - 带有 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_TIME
是varchar
2018-04-04 00:00:00
2010-01-04 00:00:00
2020-12-10 00:00:00
我的查询中有任何错误吗?
预先感谢您的帮助
解决方案
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'
推荐阅读
- javascript - 如何将“名字”表单与我的函数联系起来?
- javascript - Yi2 使用 SendFile() 下载文件
- java - 如何将每个测试嵌入到包装器逻辑中?
- excel - 如何显示 Excel 桌面应用程序的聊天图标?
- javascript - 用于调整两个 div 大小的垂直拖动条
- asp.net-mvc - VS 2017 不会在适当的视觉设计器中打开 .edmx 文件
- ios - 关于 UIImageView 自定义的建议
- kotlin - RX方式获取本地数据并发送到远程
- python - 如何解决“错误的项目数通过 5,位置暗示 1”
- html - 字体大小随页面焦点或字段焦点而变化