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

MySQL如何筛选datetime字段不等于0000-00-00 00:00:00的行?

为什么IS NOT NULL无法过滤0000-00-00 00:00:00的datetime行?

这是个非常常见的MySQL datetime字段误区,我来帮你理清问题:

核心原因

0000-00-00 00:00:00并不是NULL值——它是一个MySQL允许的合法“零日期”值(只要你的sql_mode没有启用NO_ZERO_DATE这类严格限制规则)。而IS NOT NULL这个条件只会筛选掉字段值真正为NULL的行,完全不会影响零日期的记录,这就是你的查询结果不符合预期的根本原因。

正确的解决方案

要过滤掉零日期的行,你需要直接和这个零日期值做比较:

1. 仅过滤零日期

SELECT * FROM `tb_posts` WHERE `post_date_published` != '0000-00-00 00:00:00';

或者用SQL标准的不等于运算符<>,效果完全一致:

SELECT * FROM `tb_posts` WHERE `post_date_published` <> '0000-00-00 00:00:00';

2. 同时过滤NULL和零日期

如果你的表中既有NULL值又有零日期,想要同时排除这两种情况,可以把两个条件结合:

SELECT * FROM `tb_posts` 
WHERE `post_date_published` IS NOT NULL 
AND `post_date_published` != '0000-00-00 00:00:00';

额外提示

如果你的MySQL环境开启了STRICT_TRANS_TABLES或者NO_ZERO_DATE这类严格模式,零日期会被禁止插入到datetime字段中,但如果是历史遗留数据已经存在零日期,上面的查询依然适用。

内容的提问来源于stack exchange,提问作者Sachin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:12:31