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

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

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

【问题讨论】:

    标签: php mysql datetime


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    【解决方案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 是传入的值。在这种情况下,为什么不检查它是NULLdev.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());
        

        【讨论】:

          猜你喜欢
          • 2015-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多