2011-11-06 123 views
1

我有一个DATETIME值“some_date”,可以在我的数据库中为null。当我尝试下面的查询返回没有为这些行与日期为空:MySQL DATE_ADD()DATE为空时

SELECT * 
FROM tabel 
WHERE DATE_ADD(some_date, INTERVAL some_seconds SECOND) < NOW() 

我可以编辑此查询,以便DATE_ADD()会产生日期,即使some_date为空?

回答

5

你可以使用COALESCE到NULL日期别的转换,例如:

select * 
from table 
where date_add(coalesce(some_date, now()), interval some_seconds second) < now() 

COALESCE返回它的第一个非NULL参数:

COALESCE(value, ...)
返回第一个非列表中为NULL值,如果没有非NULL值,则为NULL。

所以你只需要决定你想用哪个日期来代替NULL some_date


如果您更换一个NULL some_date将是远远不够成为过去,测试将永远传递,那么你可以使用:

where some_date is null 
    or date_add(some_date, interval some_seconds second) < now() 

,如果它总是会失败,那么:

where some_date is not null 
    and date_add(some_date, interval some_seconds second) < now() 
+0

非常感谢您的先生:) – BigJ

+0

它会变慢,因为没有索引可以用于此查询... – glglgl

+0

仅供参考,我正在使用COALESCE(some_date,“2000-01-01 00:00:00 “) – BigJ

2

这可能是一个更清晰一点使用下面的查询:

SELECT * 
FROM tabel 
WHERE some_date IS NULL OR DATE_ADD(some_date, INTERVAL some_seconds SECOND) < NOW() 
+0

它测试了它,它工作。但是为什么?在WHERE条件下你说什么? – BigJ

+0

The如果some_date没有被设置(null)或者它被设置,那么WHERE子句是真的,当它加上一些秒数小于当前时间时。 –