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
相关产品推荐
相关产品推荐

