选择空的mysql datetime字段

时间:2009-02-18 02:10:01

标签: php mysql datetime

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

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

8 个答案:

答案 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。

来自manual

  

对于声明为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());