0

我有这样的数据库结构 -

表:任务

列:TaskID、TaskDescription、TaskCreatedDate

因此,如果我想找到TaskCreatedDate与当前时间戳最接近的较大值,并且如果没有任何任务的值大于当前时间戳,则找到与当前时间戳TaskCreatedDate最接近的较小值。这应该在单个查询中完成。我怎样才能做到这一点?

请帮忙。提前致谢

4

5 回答 5

1
-- IN ONE GO
select t.*, coalesce( (select TaskCreatedDate from Tasks where TaskCreatedDate > t.TaskCreatedDate ORDER BY TaskCreatedDate ASC LIMIT 1),
                      (select TaskCreatedDate from Tasks where TaskCreatedDate < t.TaskCreatedDate ORDER BY TaskCreatedDate DESC LIMIT 1)
            )
  from Tasks as t

当 first 为 null 时,coalesce 允许我们返回第二个条件

于 2013-05-30T13:46:16.327 回答
0

那这个呢?

SELECT *
FROM Tasks
ORDER BY (CASE WHEN TIMEDIFF(TaskDueDate, CURRENT_TIMESTAMP()) > 0 THEN 0 ELSE 1 END), 
    (CASE WHEN TIMEDIFF(TaskDueeDate, CURRENT_TIMESTAMP()) > 0
        THEN TIMEDIFF (TaskDueeDate, CURRENT_TIMESTAMP())
        ELSE TIMEDIFF (CURRENT_TIMESTAMP(), TaskDueDate)
     END)

这将为您提供所有具有未来到期日期的任务,按日期递增排序,然后是过去到期日期按递减日期排序的任务。如果您只想要一项任务,LIMIT 1请在最后添加

于 2013-05-30T13:53:11.557 回答
0

获取第一个比现在更晚的任务(如果有)的并集,加上最后一个比现在更早的任务,并保留第一个结果。

(select TaskId, TaskDescription, TaskDueDate from Tasks
        where TaskDueDate >= now() 
        order by TaskDueDate
        limit 1)
union
(select TaskId, TaskDescription, TaskDueDate from Tasks
        where TaskDueDate < now() 
        order by TaskDueDate desc
        limit 1)
limit 1
于 2013-05-30T13:48:13.443 回答
0

由于我们没有一段代码可以很好理解,您可以尝试:

select      *
from        Tasks 
order by    cast([TaskDueDate] as datetime) asc

CASTCONVERT将值从一种数据类型显式转换为另一种数据类型。

于 2013-05-30T13:39:39.567 回答
0

这需要一个巧妙的order by子句:

select *
from tasks
order by  TaskCreatedDate > now() desc,
         (case when TaskCreatedDate > now() then TaskCreatedDate end) asc,
         (case when TaskCreatedDate < now() then TaskCreatedDate end) desc
limit 1;

根据您的类型是如何定义的,您可能希望使用CURRENT_TIMESTAMP而不是now().

order by 中的第一个子句先是未来日期,然后是过去日期。第二个将未来日期按 TaskCreatedDate 升序排列,因此最接近的日期是第一个。如果没有,则第三个开始发挥作用,将其余部分降序排列。

于 2013-05-30T13:46:06.857 回答