选择空的 mysql 日期时间字段

问题描述 投票:0回答:9

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

SELECT * FROM `table` WHERE `datetime_field` = '0000-00-00 00:00:00'
php mysql datetime
9个回答
51
投票

用什么方式比较好?该查询会执行您要求的所有操作,并且只要

datetime_field
上有索引,它就会尽可能快。

如果您担心查询看起来“丑陋”,不用担心。其意图非常明确。

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

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

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

IS NULL
可能不起作用。


31
投票

SELECT * FROM db.table WHERE UNIX_TIMESTAMP(datetime_field) = 0

我喜欢这段代码,因为它不仅捕获“零日期”(例如“0000-00-00 00:00:00”)还捕获“日期中的零”(例如“2010-01-00 00:00:00” ')


21
投票

如果您的日期/日期时间列不为空,您可以使用:

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

MySQL 将为您选择等于“0000-00-00 00:00:00”的列。

注意:如果您这样做:

SELECT `datetime_field` IS NULL

MySQL 将返回 0(假),但当用作 WHERE 子句的一部分时,该语句将为 true。

摘自手册

对于声明为 NOT NULL 的 DATE 和 DATETIME 列,您可以使用如下语句找到特殊日期 '0000-00-00':

SELECT * FROM tbl_name WHERE date_column IS NULL

这是使某些 ODBC 应用程序正常工作所必需的,因为 ODBC 不支持“0000-00-00”日期值。


9
投票

或者你可以简单地这样做:

SELECT * FROM `table` WHERE `datetime_field` = 0

6
投票

我用这个:

SELECT * FROM `table` WHERE UNIX_TIMESTAMP(`datetime_field`) = 0

4
投票

作为另一种选择,我看到:

SELECT * FROM `table` WHERE YEAR(`datetime_field`)=0

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。


0
投票

你可以编写一个 MySQL 函数,这样你就可以把丑陋的东西放在那里。

分隔符 //

创建函数 isEmptyDateTime(dateTimeValue VARCHAR(50)) 返回布尔值
开始
    DECLARE isEmpty BOOLEAN;

    -- 检查输入字符串是否为NULL或空
    IF dateTimeValue IS NULL 或 TRIM(dateTimeValue) = '' THEN
        SET isEmpty = TRUE;
    别的
        -- 检查输入字符串是否仅包含 '0'、'-'、':' 和 ' ' 字符
        SET 为空 = (
            选择
                案件
                    当 dateTimeValue REGEXP '^[0:-]*$' 则为 TRUE
                    否则错误
                结尾
        );
    万一;

    返回值为空;
结尾//

分隔符;

-3
投票

让我发表免责声明,我不确定这会做什么。但如果能成功的话那就太酷了。

SELECT * FROM table WHERE datetime = DATESUB(NOW(),NOW());
© www.soinside.com 2019 - 2024. All rights reserved.