MySQL - 获取两天之间的下一个最近的一天

时间:2013-07-03 12:36:04

标签: mysql sql sql-order-by sql-limit

我们在数据库中有两个日期:

  1. 2013年8月1日
  2. 2013年8月3日
  3. 假设今天的日期是2013-08-02,我们希望从数据库获得下一个最接近的日期。我已经找到了这个查询,但它没有在第二天而是上一次:

    SELECT 
      * 
    FROM 
      your_table 
    ORDER BY 
      ABS(DATEDIFF(NOW(), `date`))
    LIMIT 1
    

    当我们运行它时,我们得到2013-08-01而不是2013-08-03。会有什么解决方案?

5 个答案:

答案 0 :(得分:2)

SELECT   *
FROM     your_table
WHERE    date >= CURRENT_DATE
ORDER BY date
LIMIT    1

答案 1 :(得分:2)

如果你总是想要一个未来的日期,其他人已经发布了答案:

select *
from your_table
where date > now()
order by date 
limit 1

如果没有未来日期且您仍想返回上一个日期,则可以通过修改order by子句来执行此操作:

select *
from your_table
order by (date > now()) desc,
         (case when date > now() then date end) ,
         date desc
limit 1;

编辑(回应评论):

要将“今天”作为最接近的日期处理,您需要将now()转换为日期并使用>=

select *
from your_table
order by (`date` >= date(now())) desc,
         (case when `date` >= date(now()) then `date` end) ,
         `date` desc
limit 1;

order by子句有三个组件。第一个是未来日期的标志。这将未来日期放在首位。第二个两个条款按日期排序。第一个按升序排列未来日期。过去的日期都具有相同的值('NULL'),因此这些值受第三个子句的影响,后者按降序排序。

答案 2 :(得分:0)

SELECT * FROM table WHERE date > NOW() ORDER BY date ASC LIMIT 1;

您将获得下一个最近的日期

答案 3 :(得分:0)

SELECT * FROM your_table
ORDER BY 
  MIN(DATEDIFF(NOW(), `date`)) ASC
LIMIT 1

会给你更高的一个,因为未来的日期会是-1,然后是1,2,......,所以按ASC排序并没有ABS,但不确定它对你所有情况都有好处。

答案 4 :(得分:0)

它必须有一个条件where超过日期只提供下一个日期而不是之前的日期