SQL查询:如何正确返回日期早于今日的行并标记为TRUE?
解决SQL日期比较逻辑错误的方案
你的问题根源在于直接对格式化后的字符串进行大小比较——字符串是按字符的ASCII顺序逐位对比,而非日期的逻辑顺序。比如"30.12.22"和"28.10.22",字符串对比会优先看首位数字"3"和"2",完全忽略日期的月份、年份逻辑,导致判断错误。
正确的查询写法
先把WFD_AttText5中的字符串日期提取出有效日期部分,转换为日期类型,再和今日日期(去掉时间部分)对比:
SELECT WFD_AttText5 AS 'Datum Formularfeld', FORMAT(GETDATE(), 'dddd, dd.MM.yy', 'de-de') AS 'TODAY formattiert', CASE WHEN TRY_CONVERT(DATE, LTRIM(SUBSTRING(WFD_AttText5, CHARINDEX(',', WFD_AttText5) + 1, LEN(WFD_AttText5))), 104) < CAST(GETDATE() AS DATE) THEN 'TRUE' ELSE 'FALSE' END AS [Match] FROM WFElements WHERE WFD_DTYPEID = 83
代码解释
- 提取并转换日期:
CHARINDEX(',', WFD_AttText5)定位字符串中逗号的位置,截取逗号后的部分(去掉星期几文本)LTRIM()清除日期部分开头的空格TRY_CONVERT(DATE, ..., 104)将dd.MM.yy格式的字符串转换为DATE类型,104是SQL Server对应dd.MM.yyyy的格式代码,两位年份会自动映射为20xx(如22→2022)
- 今日日期处理:
CAST(GETDATE() AS DATE)获取今日纯日期部分(不带时间,避免时间干扰对比) - 条件判断:用CASE语句根据日期对比结果标记TRUE/FALSE
其他数据库适配说明
如果你的数据库不是SQL Server,转换函数需调整:
- MySQL:
STR_TO_DATE(SUBSTRING_INDEX(WFD_AttText5, ',', -1), '%d.%m.%y') - PostgreSQL:
TO_DATE(TRIM(SUBSTRING(WFD_AttText5 FROM POSITION(', ' IN WFD_AttText5) + 2)), 'DD.MM.YY')
内容的提问来源于stack exchange,提问作者colonel_claypoo
相关产品推荐
相关产品推荐

