SQL Server:从表中选择最小值

时间:2015-06-21 14:12:28

标签: sql sql-server date select

我知道这是一个简单的问题,但我仍然无法弄明白。

我想找到距离现在最近的日期。

这是我的product表:

P_INDATE
----------    
2013-11-03  
2013-12-13 
2013-11-13

基本上,它应该显示2013-12-13

我输入SELECT Max( P_INDATE) FROM product,然后就可以了。

然后,我尝试在MIN((GETDATE()- P_INDATE))条件下使用where,但我失败了。

5 个答案:

答案 0 :(得分:1)

使用MAXWHERE子句以及函数GETDATE()

SELECT MAX(P_INDATE)
FROM product 
WHERE P_INDATE < GETDATE()

以上查询为您提供了最大日期,该日期小于当前日期,您可以使用函数GETDATE()

答案 1 :(得分:1)

解决此问题的一种方法是按存储日期和当前日期之间的差异对查询进行排序,并仅采用第一行。使用abs将允许您查找最近的日期,无论其在当前日期之前还是之后。

SELECT   TOP 1 p_indate
FROM     mytable
ORDER BY ABS(GETDATE() - p_indate) ASC

答案 2 :(得分:0)

假设您有一个存储数据的列,并且您希望每次只显示最近的一个,为什么不能使用

从yourtable中选择max(date),这将始终为您提供最近的日期

答案 3 :(得分:0)

如果列上有索引,最有效的方法可能有点复杂:

SELECT TOP 1 P_INDATE
FROM ((SELECT TOP 1 P_INDATE
       FROM product 
       WHERE P_INDATE < GETDATE()
       ORDER BY P_INDATE DESC
      ) UNION ALL
      (SELECT TOP 1 P_INDATE
       FROM product
       WHERE P.INDATE >= GETDATE()
       ORDER BY P.INDATE
      )
     )
ORDER BY ABS(DATEDIFF(second, P_INDATE, GETDATE()))

子查询将使用索引来获取(最多)一行早于当前日期。外ORDER BY只需要对两行进行排序。

答案 4 :(得分:0)

你可以试试这个:

SELECT TOP(1) P_INDATE
FROM [product table]
ORDER BY CASE 
            WHEN DATEDIFF(day,P_INDATE,GETDATE()) < 0 
            THEN DATEDIFF(day,GETDATE(),P_INDATE) 
            ELSE DATEDIFF(day,P_INDATE,GETDATE()) 
        END ASC