如何基于startDate和dueDate提取数据库中的历史与待办事件ID
解决events表的历史/待办事件查询问题
嘿,我来帮你搞定这个SQL查询的问题!首先咱们得先弄明白你原来的查询为什么没返回结果——你的语句SELECT * FROM events WHERE startDate >= '2018-01-30' AND dueDate <= '2018-01-30'逻辑上是矛盾的:它要求事件的开始日期大于等于2018-01-30,同时结束日期小于等于2018-01-30,这只有当startDate和dueDate完全等于2018-01-30时才会命中,但你的数据里根本没有这样的记录,所以自然返回空啦。
下面针对你的两个需求分别给出正确的SQL语句:
1. 查询历史事件ID(Past EventId)
你的需求是找出startDate和dueDate均早于2018-01-30的事件,也就是整个事件已经完全结束。考虑到事件的startDate肯定是小于等于dueDate的,所以其实只要判断dueDate < '2018-01-30'就足够了(因为结束日期早于目标日期的话,开始日期必然也早于)。当然如果你想严格按照需求写出两个条件也完全没问题:
简洁版SQL:
SELECT eventId FROM events WHERE dueDate < '2018-01-30';
严格匹配需求的SQL:
SELECT eventId FROM events WHERE startDate < '2018-01-30' AND dueDate < '2018-01-30';
这两个语句都会返回你预期的eventId 1、2。
2. 查询待办事件ID(Upcoming EventId)
需求是找出**起止日期未全部结束(即dueDate晚于2018-01-30)**的事件,也就是还在进行中或尚未开始但会在之后结束的事件。只需要判断dueDate > '2018-01-30'即可:
SELECT eventId FROM events WHERE dueDate > '2018-01-30';
这个语句会返回你预期的eventId 3。
额外福利:一次查询区分事件状态
如果你想在一次查询里同时得到每个事件的状态(历史/待办),可以用CASE语句来实现:
SELECT eventId, name, startDate, dueDate, CASE WHEN dueDate < '2018-01-30' THEN 'Past' WHEN dueDate > '2018-01-30' THEN 'Upcoming' ELSE 'Today' -- 处理起止日期恰好是2018-01-30的情况 END AS event_status FROM events;
内容的提问来源于stack exchange,提问作者Ganesh M
相关产品推荐
相关产品推荐

