SQL中使用varchar类型日期列筛选近30天数据问题求助
失效原因排查
核心失效原因通常有两类:
- 数据中存在不符合
YYYY-MM-DD格式的脏数据,CAST操作遇到非法格式时会返回NULL或直接报错,导致筛选逻辑不生效 - 日期区间计算逻辑不符合ANSI SQL标准,未正确获取30天前的临界日期
验证转换有效性
先执行以下查询确认CAST是否正常工作,排查是否存在转换失败的脏数据:
SELECT my_date, CAST(my_date AS DATE) AS parsed_date FROM 你的表名;
如果返回结果中parsed_date列存在NULL,对应行的my_date就是非法格式的脏数据,优先清理后再执行筛选。
正确的ANSI SQL筛选写法
无脏数据的场景下直接使用标准写法:
SELECT my_date, metric_name FROM 你的表名 WHERE CAST(my_date AS DATE) >= CURRENT_DATE - INTERVAL '30' DAY;
如果存在无法清理的脏数据,可使用TRY_CAST避免转换报错,非法格式的行将自动被过滤:
SELECT my_date, metric_name FROM 你的表名 WHERE TRY_CAST(my_date AS DATE) >= CURRENT_DATE - INTERVAL '30' DAY;
如果数据库不支持TRY_CAST,可先加格式校验逻辑再做转换(正则语法可根据使用的数据库调整):
SELECT my_date, metric_name FROM 你的表名 WHERE my_date ~ '^\d{4}-\d{2}-\d{2}$' AND CAST(my_date AS DATE) >= CURRENT_DATE - INTERVAL '30' DAY;
补充说明
如果以上写法仍未生效,检查数据库时区配置:CURRENT_DATE默认取数据库服务器的本地日期,需确认和my_date列存储的日期所属时区一致。
内容的提问来源于stack exchange,提问作者Chrissie M.
相关产品推荐
相关产品推荐

