还有比这更好的方法来选择空日期时间字段吗?
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 may 以这种可怕的方式表示真正的 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 子句的一部分时,该语句将为 true。
对于声明为 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。
你可以编写一个 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 否则错误 结尾 ); 万一; 返回值为空; 结尾// 分隔符;
让我发表免责声明,我不确定这会做什么。但如果能成功的话那就太酷了。
SELECT * FROM table WHERE datetime = DATESUB(NOW(),NOW());