SQL - 查找最接近当前日期的日期

Posted

技术标签:

【中文标题】SQL - 查找最接近当前日期的日期【英文标题】:SQL - Find date closest to current date 【发布时间】:2013-05-06 12:21:21 【问题描述】:

我的 SQL 查询遇到了一些问题。 我得到了这张桌子:

insert into Table1 (date, personssn)
insert ('2012-01-21 12:01:33', '123456789');
insert into Table1 (date, personssn)
insert ('2012-02-22 12:01:33', '123456789');

问题是我想选择日期最接近当前日期的人员。我一直在使用“CURDATE()”,但似乎无法让它工作。任何人都可以在正确的方向上帮助我吗?

谢谢。

【问题讨论】:

限制 1、绝对值 (ABS) 和与 sysdate/curdate 的日期差 【参考方案1】:
select  *
from    Table1
order by
        abs(now() - date) desc
limit   1

【讨论】:

应该按升序排序(与现在的最小日期差)。如果您想要最接近的即将到来的日期,我建议添加一个 where 子句以消除过去的日期(使用 abs 会使 1 天前的日期排序高于例如 2 天内的日期)。【参考方案2】:

使用日期差异。它返回两个日期之间的差异。 但是,您可以在数据库中包含今天之前和之后的日期。这就是为什么你需要 ABS() 没有它,首先选择最小值,但我们想要最接近 0 的值。 IE a Date-Difference of 3 比 -250“大”,但更接近 3 天。这就是你使用绝对值的原因。

SELECT t1.date, t1.personssn 
  FROM Table1 AS t1
 ORDER BY ABS(DATEDIFF(t1.date, NOW())) ASC
 LIMIT 5

【讨论】:

【参考方案3】:

用简单的顺序试试这个:

SELECT date,personssn FROM Table1 ORDER BY date desc

【讨论】:

【参考方案4】:

类似:

with myCTE as (
SELECT to_date('21-Jan-2012 12:00') as mydate, '123456789' as myId FROM DUAL UNION
Select to_date('22-Feb-2012 12:00') as mydate, '123456789' FROM DUAL )
Select abs(sysdate-mydate) as diff, mydate, myID from myCTE order by diff

但这是 oracle.. 我不确定 mysql 文本。

【讨论】:

【参考方案5】:

使用 MAX(date),如果你只想要一行作为输出,否则使用 date

【讨论】:

可能是因为你无法使用max 找到最近的记录,即使可以,你会如何显示对应的SSN? 我没有投票,但我假设这是因为您的方法假设表格中的日期永远不会超过当前日期,并且选择 max 只会返回系统中的最新日期,无论它与当前日期的接近程度。

以上是关于SQL - 查找最接近当前日期的日期的主要内容,如果未能解决你的问题,请参考以下文章

在最接近指定日期的列表中查找上一个日期

使用大数据集Mysql在两组日期中查找最接近的较低日期

SQL Server 查找接近服务日期和月份的行

按日期查找记录sql Server

SQL 中高效的“查找最近的数字或日期”,其中日期/数字列被索引覆盖

在 SQL Server 中查找最近的日期