选择空的 mysql 日期时间字段

Posted

技术标签:

【中文标题】选择空的 mysql 日期时间字段【英文标题】:Selecting empty mysql datetime fields 【发布时间】:2010-10-08 06:11:57 【问题描述】:

还有比这更好的选择空日期时间字段的方法吗?

SELECT * FROM `table` WHERE `datetime_field` = '0000-00-00 00:00:00'

【问题讨论】:

【参考方案1】:

在什么方面更好?该查询可以满足您的所有要求,并且只要在 datetime_field 上有一个索引,它就会尽可能快。

如果您担心查询看起来“难看”,请不要担心。它的意图很明确。

您可以考虑的唯一可能的改进是对这些零日期/时间行使用 NULL,在这种情况下,您的查询变为:

SELECT * FROM `table` WHERE `datetime_field` IS NULL

这就是我对符合标准的 DBMS 所做的事情。我的理解是 mysql 可能以这种可怕的方式表示真正的 NULL 日期时间字段,在这种情况下,我猜 IS NULL 可能不起作用。

【讨论】:

刚刚遇到“IS NOT NULL”不起作用的情况。与“丑陋”的字符串相比可能会更好。见dev.mysql.com/doc/refman/5.7/en/using-date.html【参考方案2】:

SELECT * FROM db.table WHERE UNIX_TIMESTAMP(datetime_field) = 0

我喜欢这段代码,因为它不仅捕获“零日期”(例如 '0000-00-00 00:00:00')还捕获“日期中的零”(例如 '2010-01-00 00:00 :00')

【讨论】:

我同意,有一些看起来不同的东西也很好,尽管一排零看起来很明显,我想。 然而,此代码对于 unix 时间戳时代 1971 年之前的日期失败,因此除了当前日期之外它不可用。例如,出生日期。【参考方案3】:

如果您的日期/日期时间列不为空,您就可以使用:

SELECT * FROM `table` WHERE `datetime_field` IS NULL

MySQL 将为您选择等于 '0000-00-00 00:00:00' 的列。

注意:如果你这样做:

SELECT `datetime_field` IS NULL

MySQL 将返回 0(假),但当用作 WHERE 子句的一部分时,此语句将为真。

来自manual

对于声明为 NOT NULL 的 DATE 和 DATETIME 列,您可以使用如下语句找到特殊日期“0000-00-00”:

SELECT * FROM tbl_name WHERE date_column IS NULL

这是使某些 ODBC 应用程序工作所必需的,因为 ODBC 不支持“0000-00-00”日期值。

【讨论】:

【参考方案4】:

或者你可以简单地做:

SELECT * FROM `table` WHERE `datetime_field` = 0

【讨论】:

也适用于 != 0,不像 NOT NULL。【参考方案5】:

我用这个:

SELECT * FROM `table` WHERE UNIX_TIMESTAMP(`datetime_field`) = 0

【讨论】:

我在 ubuntu 20.04 上使用 MySQL > 10 并且 UNIX_TIMESTAMP('0000-00-00 00:00:00') 返回 null 而不是零!所以,我在查询中使用了 null 并且效果很好。【参考方案6】:

作为另一种选择,我已经看到:

SELECT * FROM `table` WHERE YEAR(`datetime_field`)=0

【讨论】:

【参考方案7】:
SELECT * FROM `table` WHERE UNIX_TIMESTAMP(`datetime_field`) IS NULL

使用 UNIX_TIMESTAMP,它处理 null、空和任何无效的日期时间字符串。

正如@Lizardx 在本页前面提到的,UNIX_TIMESTAMP 不支持非常旧的或未来的日期。在这种情况下,可以省略该功能及其好处!

UNIX_TIMESTAMP 的参数值的有效范围是从 1970-01-01 00:00:01.000000 UTC 到 2038-01-19 03:14:07.999999 UTC。

【讨论】:

UNIX_TIMESTAMP() 唯一不返回无符号数的情况是 NULL 是传入的值。在这种情况下,为什么不检查它是NULL? dev.mysql.com/doc/refman/8.0/en/… 请通过在您的答案中编辑一些解释来捍卫您的 sn-p 作为一种良好的编码技术。 datetime值为1969-12-30 23:59:59的结果是什么?【参考方案8】:

让我发表一个免责声明,我不确定这会做什么。但如果它起作用了,那就太酷了。

SELECT * FROM table WHERE datetime = DATESUB(NOW(),NOW());

【讨论】:

以上是关于选择空的 mysql 日期时间字段的主要内容,如果未能解决你的问题,请参考以下文章

从日期时间字段Mysql查询中获取日期

如何从 MySQL 的 DATETIME 字段中仅选择日期?

数据库的日期类型字段该如何选择

数据库中如何查找日期为空的数据

mysql选择范围内的日期时间对象

将当前日期添加到空的日期字段