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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:10:32