有没有比这更好的方法来选择空的日期时间字段?
SELECT * FROM `table` WHERE `datetime_field` = '0000-00-00 00:00:00'
答案 0 :(得分:39)
更好的方式是什么?该查询会执行您对其提出的所有要求,并且只要datetime_field
上有索引,它就会达到最快速度。
如果您担心查询看起来“丑陋”,请不要。它的意图很明确。
您可以考虑的唯一可能的改进是对这些零日期/时间行使用NULL,在这种情况下您的查询变为:
SELECT * FROM `table` WHERE `datetime_field` IS NULL
这就是我对符合标准的DBMS所做的事情。我的理解是,MySQL 可能以这种可怕的方式表示真正的NULL日期时间字段,在这种情况下,我猜IS NULL
可能不起作用。
答案 1 :(得分:26)
SELECT * FROM db.table WHERE UNIX_TIMESTAMP(datetime_field) = 0
我喜欢这段代码,因为它不仅捕获“零日期”(例如'0000-00-0000:00 00:00')也会捕获“日期中的零”(例如'2010-01-00 00:00 :00' )
答案 2 :(得分:16)
如果您的日期/日期时间列不是NULL,您可以使用:
SELECT * FROM `table` WHERE `datetime_field` IS NULL
MySQL将为您选择等于'0000-00-00 00:00:00'的列。
注意:如果你这样做:
SELECT `datetime_field` IS NULL
MySQL将返回0(false),但当用作WHERE子句的一部分时,此语句将为true。
对于声明为NOT NULL的DATE和DATETIME列,您可以使用如下语句找到特殊日期'0000-00-00':
SELECT * FROM tbl_name WHERE date_column IS NULL
这需要一些ODBC应用程序才能工作,因为ODBC不支持'0000-00-00'日期值。
答案 3 :(得分:7)
或者您可以这样做:
SELECT * FROM `table` WHERE `datetime_field` = 0
答案 4 :(得分:5)
我用这个:
SELECT * FROM `table` WHERE UNIX_TIMESTAMP(`datetime_field`) = 0
答案 5 :(得分:2)
作为另一种选择,我看到了:
SELECT * FROM `table` WHERE YEAR(`datetime_field`)=0
答案 6 :(得分:0)
SELECT * FROM `table` WHERE UNIX_TIMESTAMP(`datetime_field`) IS NULL
使用 UNIX_TIMESTAMP,它可以处理空、空和任何无效的日期时间字符串。
正如@Lizardx 在本页前面提到的,UNIX_TIMESTAMP 不支持非常旧或未来的日期。在这种情况下,可以省略该功能及其好处!
UNIX_TIMESTAMP 的参数值的有效范围是从 1970-01-01 00:00:01.000000 UTC 到 2038-01-19 03:14:07.999999 UTC。
答案 7 :(得分:-1)
让我发表免责声明,我不确定这会做什么。但是如果它奏效的话会很酷。
SELECT * FROM table WHERE datetime = DATESUB(NOW(),NOW());