这是我的表格“ tb_posts”:
我只想选择日期时间字段(即post_date_published)不等于0000-00-00 00:00:00的那些行。我正在使用以下查询,但不起作用:
SELECT * FROM `tb_posts` WHERE `post_date_published` IS NOT NULL
我得到与上图相同的输出。
为什么IS NOT NULL
不起作用?
答案 0 :(得分:1)
根据MYSQL documentation,它将无效日期保存为“ 0000-00-00 00:00:00”。它不会被视为NULL。
尝试与日期“ 0000-00-00 00:00:00 ”进行比较:
SELECT * FROM tb_posts where post_date_published != '0000-00-00 00:00:00'
答案 1 :(得分:1)
我用于这种事情的一种方法是
SELECT `columns` FROM `tb_posts` WHERE UNIX_TIMESTAMP(`post_date_published`) > 0
参数值的有效范围与TIMESTAMP的范围相同 数据类型:“ 1970-01-01 00:00:01.000000” UTC为“ 2038-01-19” 03:14:07.999999'UTC。 如果您将超期日期传递给 UNIX_TIMESTAMP(),它返回0 。
UNIX_TIMESTAMP
函数将结果强制为整数,因此在这些快速比较中使用起来要容易得多。这对于在不允许使用“空”(即零值)日期/时间列的 MySQL 5.7 中也至关重要。
(我很难过,试图将各种日期列转换为NULL
,因为MySQL 5.7+不能将0000-00-00 00:00:00
识别为有效的比较-所以我将其转换为Unix时间戳,以便比较时间戳而不是实际的[无效] 日期。)