【问题标题】:MySQL - Get next closest day between two daysMySQL - 在两天之间获取下一个最近的一天
【发布时间】:2013-07-01 03:42:11
【问题描述】:

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

  1. 2013-08-01
  2. 2013-08-03

假设今天的日期是 2013-08-02,我们想从数据库中获取下一个最接近的日期。我找到了这个查询,但不是第二天而是上一个:

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

当我们运行它时,我们会得到 2013-08-01 而不是 2013-08-03 我们想要的。解决办法是什么?

【问题讨论】:

  • 您总是想获取未来的日期,还是想获取当前日期之前或之后最接近的日期?
  • 两个日期等距。您如何确定 2013-08-03 优于 2013-08-01?

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


【解决方案1】:

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

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'),因此这些日期会受到按降序排列的第三个子句的影响。

【讨论】:

  • 第二个查询差不多了,但是如果还有指向今天的日期呢?
  • 非常感谢!您能否在“order by”中添加一些 cmets,因为这是我第一次看到带有更多“order by”子查询的查询,尤其是对于我来说是新事物的案例。
【解决方案2】:
SELECT   *
FROM     your_table
WHERE    date >= CURRENT_DATE
ORDER BY date
LIMIT    1

【讨论】:

  • 如果没有更接近的过去日期,我认为 OP 只想要未来的日期。
【解决方案3】:
SELECT * FROM table WHERE date > NOW() ORDER BY date ASC LIMIT 1;

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

【讨论】:

  • 但是如果目前没有任何未来的日期,只有过去的日期怎么办?
【解决方案4】:

它必须有一个条件where 在日期上只给出下一个日期而不是以前的日期

【讨论】:

  • 请举个例子。谢谢!
  • 假设我们有这些值:
    01-01-2013
    03-01-2013
    05-01-2013
    和 NOW()函数返回 02-01-2013
    其 where 条件返回 03-01-20
【解决方案5】:
SELECT * FROM your_table
ORDER BY 
  MIN(DATEDIFF(NOW(), `date`)) ASC
LIMIT 1

会给你更高的,因为未来的日期会是-1,然后是 1,2,...,所以按 ASC 对它们进行排序,不带 ABS,但不确定它是否适合你的所有情况。

【讨论】:

  • 用这个我只能得到最新的日期,而不是当前的下一个
  • 试试MIN(DATEDIFF(NOW(), date) ASC)
猜你喜欢
  • 1970-01-01
  • 2018-10-08
  • 2019-10-16
  • 2010-12-20
  • 1970-01-01
  • 2020-03-20
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多