Mysql:找到最近的最大值,如果没有找到最接近的最小值

时间:2013-05-30 13:35:09

标签: mysql sql

我有像这样的数据库结构 -

  

表:任务

     

柱:   TaskID,TaskDescription,TaskCreatedDate

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

请帮忙。提前致谢

5 个答案:

答案 0 :(得分: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

coalesce允许我们在第一个为空时返回第二个条件

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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()

订单中的第一个子句按订单未来日期先行,然后是过去日期。第二个是按TaskCreatedDate按升序排列未来日期,因此最接近的日期是第一个。如果没有,则第三个发挥作用,命令其余的下降。

答案 3 :(得分: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

答案 4 :(得分: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