You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码解释

  1. 提取并转换日期:
    • CHARINDEX(',', WFD_AttText5)定位字符串中逗号的位置,截取逗号后的部分(去掉星期几文本)
    • LTRIM()清除日期部分开头的空格
    • TRY_CONVERT(DATE, ..., 104)将dd.MM.yy格式的字符串转换为DATE类型,104是SQL Server对应dd.MM.yyyy的格式代码,两位年份会自动映射为20xx(如22→2022)
  2. 今日日期处理:CAST(GETDATE() AS DATE)获取今日纯日期部分(不带时间,避免时间干扰对比)
  3. 条件判断:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:31:49