MariaDB 10.3中筛选未过期记录返回空结果集的排查求助
MariaDB查询无结果的问题分析与解决
你的查询返回空结果,核心是两个关键错误:
1. WHERE子句误用原表字段而非SELECT别名
MariaDB的SQL执行顺序中,WHERE子句的执行早于SELECT子句,因此你在WHERE里写的expiration_date是原表存储的Unix时间戳整数,不是SELECT中通过CASE转换后的日期别名。
2. 类型不匹配的无效对比
你用日期类型的CURDATE()和整数类型的Unix时间戳直接对比,两者数值逻辑完全不匹配:比如CURDATE()会被转换为类似20240520的整数,而正常的Unix时间戳是10位整数(如1716182400),这种对比会导致所有记录都不满足CURDATE() < expiration_date的条件,最终返回空集。
修正后的查询
根据你的需求(保留未过期记录,默认值0视为无过期),可以用以下两种方式修正:
方式一:直接判断时间戳与当前日期的时间戳
SELECT entry_id, title, CASE WHEN expiration_date = 0 THEN CURDATE() + INTERVAL 1 DAY ELSE FROM_UNIXTIME(expiration_date, "%Y-%m-%d") END AS expiration_date FROM channel_titles WHERE (expiration_date = 0) OR (expiration_date > UNIX_TIMESTAMP(CURDATE()))
UNIX_TIMESTAMP(CURDATE())会返回当天零点的Unix时间戳- 条件逻辑:保留默认值0的记录,或过期时间戳晚于当天零点的记录
方式二:将时间戳转换为日期后对比
SELECT entry_id, title, CASE WHEN expiration_date = 0 THEN CURDATE() + INTERVAL 1 DAY ELSE FROM_UNIXTIME(expiration_date, "%Y-%m-%d") END AS expiration_date FROM channel_titles WHERE (expiration_date = 0) OR (FROM_UNIXTIME(expiration_date) > CURDATE())
FROM_UNIXTIME(expiration_date)将时间戳转换为datetime类型,与CURDATE()(当天零点)对比,判断是否未过期
内容的提问来源于stack exchange,提问作者webmaster_sean
相关产品推荐
相关产品推荐

