2

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

  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 我们想要的。解决方案是什么?

4

5 回答 5

2
SELECT   *
FROM     your_table
WHERE    date >= CURRENT_DATE
ORDER BY date
LIMIT    1
于 2013-07-03T12:40:34.577 回答
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'),因此它们受第三个子句的影响,该子句按降序排列。

于 2013-07-03T12:58:44.350 回答
0
SELECT * FROM table WHERE date > NOW() ORDER BY date ASC LIMIT 1;

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

于 2013-07-03T12:41:04.027 回答
0
SELECT * FROM your_table
ORDER BY 
  MIN(DATEDIFF(NOW(), `date`)) ASC
LIMIT 1

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

于 2013-07-03T12:46:29.220 回答
0

它必须在日期上存在一个条件where,只提供下一个日期而不是以前的日期

于 2013-07-03T13:12:38.870 回答