选择空的 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 日期时间字段的主要内容,如果未能解决你的问题,请参考以下文章