我有一个尚未播放的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()
实际上是一个布尔值,添加IF
或CASE
语句只是多余的:
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