我们在数据库中有两个日期:
- 2013-08-01
- 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-02,我们想从数据库中获取下一个最接近的日期。我找到了这个查询,但不是第二天而是上一个:
SELECT
*
FROM
your_table
ORDER BY
ABS(DATEDIFF(NOW(), `date`))
LIMIT 1
当我们运行它时,我们会得到 2013-08-01 而不是 2013-08-03 我们想要的。解决方案是什么?
SELECT *
FROM your_table
WHERE date >= CURRENT_DATE
ORDER BY date
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'
),因此它们受第三个子句的影响,该子句按降序排列。
SELECT * FROM table WHERE date > NOW() ORDER BY date ASC LIMIT 1;
您将获得下一个最接近的日期
SELECT * FROM your_table
ORDER BY
MIN(DATEDIFF(NOW(), `date`)) ASC
LIMIT 1
会给你更高的,因为未来的日期会是-1,然后是 1,2,...,所以按 ASC 对它们进行排序并且没有 ABS,但不确定它是否适合你的所有情况。
它必须在日期上存在一个条件where
,只提供下一个日期而不是以前的日期