我们在数据库中有两个日期:
假设今天的日期是2013-08-02,我们希望从数据库获得下一个最接近的日期。我已经找到了这个查询,但它没有在第二天而是上一次:
SELECT
*
FROM
your_table
ORDER BY
ABS(DATEDIFF(NOW(), `date`))
LIMIT 1
当我们运行它时,我们得到2013-08-01而不是2013-08-03。会有什么解决方案?
答案 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
超过日期只提供下一个日期而不是之前的日期