【问题标题】:SQL Server : select the minimum value from tableSQL Server:从表中选择最小值
【发布时间】:2015-09-07 01:09:12
【问题描述】:

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

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

这是我的product 表:

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

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

我输入这个SELECT Max( P_INDATE) FROM product 就可以了。

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

【问题讨论】:

  • 您需要最近的过去日期,还是最近的过去或未来日期?

标签: sql sql-server date select


【解决方案1】:

你可以试试这个:

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

【讨论】:

  • 这个作品也是。谢谢。这真是一个特殊的解决方案。
  • 顺便说一句,希望这是您的想法。它会给你真正的关闭日期。即使它在您提供的日期之后。举个例子:如果你给它一个日期(不是 get_date()),它在过去 10 天和未来 1 天有一行,它将返回未来的日期。如果您不会有这种行为,只需删除案例并仅使用 ELSE 中的代码。
  • 顺便说一句,如果另一个人再次遇到相同的问题,请不要忘记将任何答案标记为您的解决方案。这将很有帮助并进一步改进stackoverflow。 :-)
【解决方案2】:

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

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则只需要排序两行。

【讨论】:

  • 这很复杂,我修改成这个SELECT TOP 1 P_INDATE FROM PRODUCT ORDER BY ABS(DATEDIFF(second, P_INDATE, GETDATE())) 就可以了。
  • @CodaChang 。 . .这行得通,但它需要对整个表进行排序。此版本的目的是最大限度地提高性能。
【解决方案3】:

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

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

【讨论】:

  • 我从来没有考虑过这种方式,你帮了大忙。谢谢,
  • getdate() - p_indate 将返回一个日期时间(如果两者都是日期时间)。 ABS 无法处理日期时间类型。此外,您不能从日期时间中减去日期(我猜 p_indate 具有日期类型)
  • 是的,你是对的,p_indate 的类型是日期时间。那么,如何通过(GETDATE() - p_indate)订购?
【解决方案4】:

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

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

【讨论】:

  • 我只是想尝试另一种方式。多练习。
【解决方案5】:

MAXWHERE 子句与函数GETDATE() 一起使用:

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

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

【讨论】:

  • 这项工作,但我只是想练习另一种方式..没有MAX(P_INDATE)的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 2011-10-04
  • 2019-06-28
  • 2015-03-09
相关资源
最近更新 更多