如何检查记录的日期时间字段是否小于当前日期时间



我有一个尚未播放的match列表,现在我需要知道包含确切开始日期和时间的datetime字段是否比当前datetime小。我怎样才能实现类似的目标?

数据样本

| id | round_id | datetime      
1     1365     2018-08-19 07:00:00
2     1365     2018-08-08 11:00:00
3     1365     2018-07-28 07:00:00
4     1365     2018-07-27 11:00:00
5     1365     2018-07-29 07:00:00

所以你可以看到,我们有两个match在下个月(8月(播放,三个match在本月播放July。因此,查询应该返回true,因为几乎有一场比赛的date小调是当前日期,这意味着这个match已经比赛了。如果id为3、4、5的matches不在列表中,那么查询应该返回false

我尝试了什么

SELECT COALESCE(MIN(CASE WHEN m2.datetime < NOW() THEN true END), false)
FROM `match` m2 WHERE m2.round_id = 1365

query总是返回true,这真的很奇怪,有人能告诉我我做错了什么吗?

您甚至不需要true/false,只需引用它即可。m2.datetime < NOW()实际上是一个布尔值,添加IFCASE语句只是多余的:

SELECT m2.datetime < NOW() AS `is_less_than_today`
FROM `match` m2 WHERE m2.round_id = 1365

请参阅此处的样品小提琴。

EDIT(将返回1个真值或假值(:

SELECT SUM(m2.datetime < NOW()) > 0
FROM `match` m2
WHERE m2.round_id = 1365
GROUP BY m2.round_id

请参阅此处更新的fiddle

您不需要使用MIN函数,只需使用CASE WHEN即可实现。

SELECT *,(CASE WHEN m2.datetime < NOW() THEN true else false END)
FROM `match` m2 
WHERE m2.round_id = 1365

您的错误区域

根据描述,不需要使用min函数,但您使用了它,因此它只返回最小日期2018-07-27,因此您总是得到true

你必须做的事情只是删除min,而你忘记了将else放在你的查询中,所以把它放进去,它将完全像你期望的一样工作

如果您想要单个日期,请在case when中使用min

SELECT CASE WHEN min(m2.datetime )< NOW() THEN true else false END
FROM `match` m2 WHERE m2.round_id = 1365

最新更新