【发布时间】:2010-10-08 06:11:57
【问题描述】:
还有比这更好的选择空日期时间字段的方法吗?
SELECT * FROM `table` WHERE `datetime_field` = '0000-00-00 00:00:00'
【问题讨论】:
还有比这更好的选择空日期时间字段的方法吗?
SELECT * FROM `table` WHERE `datetime_field` = '0000-00-00 00:00:00'
【问题讨论】:
在什么方面更好?该查询可以满足您的所有要求,并且只要在 datetime_field 上有一个索引,它就会尽可能快。
如果您担心查询看起来“难看”,请不要担心。它的意图很明确。
您可以考虑的唯一可能的改进是对这些零日期/时间行使用 NULL,在这种情况下,您的查询变为:
SELECT * FROM `table` WHERE `datetime_field` IS NULL
这就是我对符合标准的 DBMS 所做的事情。我的理解是 MySQL 可能以这种可怕的方式表示真正的 NULL 日期时间字段,在这种情况下,我猜 IS NULL 可能不起作用。
【讨论】:
SELECT * FROM db.table WHERE UNIX_TIMESTAMP(datetime_field) = 0
我喜欢这段代码,因为它不仅捕获“零日期”(例如 '0000-00-00 00:00:00')还捕获“日期中的零”(例如 '2010-01-00 00:00 :00')
【讨论】:
如果您的日期/日期时间列不为空,您就可以使用:
SELECT * FROM `table` WHERE `datetime_field` IS NULL
MySQL 将为您选择等于 '0000-00-00 00:00:00' 的列。
注意:如果你这样做:
SELECT `datetime_field` IS NULL
MySQL 将返回 0(假),但当用作 WHERE 子句的一部分时,此语句将为真。
对于声明为 NOT NULL 的 DATE 和 DATETIME 列,您可以使用如下语句找到特殊日期“0000-00-00”:
SELECT * FROM tbl_name WHERE date_column IS NULL这是使某些 ODBC 应用程序工作所必需的,因为 ODBC 不支持“0000-00-00”日期值。
【讨论】:
或者你可以简单地做:
SELECT * FROM `table` WHERE `datetime_field` = 0
【讨论】:
我用这个:
SELECT * FROM `table` WHERE UNIX_TIMESTAMP(`datetime_field`) = 0
【讨论】:
作为另一种选择,我已经看到:
SELECT * FROM `table` WHERE YEAR(`datetime_field`)=0
【讨论】:
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 作为一种良好的编码技术。
1969-12-30 23:59:59的结果是什么?
让我发表一个免责声明,我不确定这会做什么。但如果它起作用了,那就太酷了。
SELECT * FROM table WHERE datetime = DATESUB(NOW(),NOW());
【讨论】: