【问题标题】:SQL query to get number of days between datesSQL查询以获取日期之间的天数
【发布时间】:2017-10-27 17:06:14
【问题描述】:

我在 SQL 中有一个表,其中一列包含许多 IDS,其中一些是重复的,第二列包含许多不同的日期

我想创建一个表格,其中我在表格左侧有一个唯一的 IDS 列表,一个名为天数的列,然后在表格中最后一个日期和倒数第二个日期之间的天数都在表中。

【问题讨论】:

  • 你能提供一个表结构,也许还有一些示例数据吗?到目前为止,您尝试过什么?
  • 如果您可以将表格数据连同所需的输出一起发布,那就太好了。视觉表示有助于解决问题
  • 了解如何提问。 stackoverflow.com/help/how-to-ask
  • 到目前为止,我已经尝试按照这个示例进行操作,但我无法弄清楚如何找到日期之间的差异,然后最重要的是我无法弄清楚如何做到这一点对于每个 ID。我会在一个月内张贴一张桌子stackoverflow.com/questions/634568/…

标签: sql sql-server


【解决方案1】:

将 Row_Number() 与条件聚合结合使用。

示例

Declare @YourTable Table ([ID] varchar(50),[DateCol] date)
Insert Into @YourTable Values 
 (1,'2017-05-01')
,(1,'2017-05-05')
,(1,'2017-05-10')  -- 2nd 
,(1,'2017-05-31')  -- Lst  21 days
,(2,'2017-05-01')
,(2,'2017-06-05')
,(2,'2017-06-10')  -- 2nd
,(2,'2017-07-31')  -- Lst 51 days

Select ID
      ,Days = DateDiff(DAY,max(case when RN=2 then DateCol end),max(case when RN=1 then DateCol end))
 From (
        Select *
              ,RN = Row_Number() over (Partition By ID Order by DateCol Desc) 
         from @YourTable
      ) A 
 Group By ID

退货

ID  Days
1   21
2   51

【讨论】:

  • 我也在尝试解释 OP 的请求。 “...表中最后一个日期和倒数第二个日期之间的天数。” 对于您的示例 ID1 应该是 21 天?
  • 我已经尝试将它应用到表中,因为 John 的表示例是正确的,但我在这里苦苦挣扎的是我的查询 SELECT TOP 100000 [YIT_ID] ,Days = DateDiff(DAY,min(Reading_Date), [YIT].[dbo].[YIT_Readings] 中的最大值(RN=2 时的情况,然后 Reading_Date 结束))从 [YIT].[dbo] 中选择 * ,RN = Row_Number() over (Partition By ID Order by DateCol Desc) .[YIT_Readings] ) A --按 ID 分组
  • @MrAssistance 查看更新的答案,Zorkolot 指出我错过了最后一个和第二个。
【解决方案2】:

在这里,我采用小于具有相同 ID 的子查询 MAX(DateCol) 的 MAX(DateCol) - 这在 DateDiff 中使用。

SELECT dT.ID
      ,(SELECT MAX(DateCol)              
          FROM @YourTable Y
         WHERE Y.DateCol < dT.MaxDateCol --Date less than MAX
           AND Y.ID = dT.ID
       ) AS [Date less than MAX]   --added by request
      ,dT.MaxDateCol AS [Max Date] --added by request
      ,DATEDIFF(DAY, (SELECT MAX(DateCol)              
                        FROM @YourTable Y
                       WHERE Y.DateCol < dT.MaxDateCol --Date less than MAX
                         AND Y.ID = dT.ID
                     ) 
                   , dT.MaxDateCol
               ) AS [Days Difference] --datediff between max and date less than MAX
  FROM (    
        SELECT ID
              ,MAX([DateCol]) [MaxDateCol] --MAX, removes duplicate ID's.
          FROM @YourTable
        GROUP BY ID
       ) AS dT

【讨论】:

  • @Zorkolot 谢谢你的帮助,对派生表的理解比我高一点。如果我想显示计算差异的 2 个日期怎么办?我将如何在两个单独的列中显示这些日期?我尝试过使用上面的代码,但运气不佳:(
  • 查看以上更改。我已经用--added by request 注释了这些行。请注意 datediff 将这两个日期作为书面形式。
  • 没问题。很高兴能帮到你!
  • @Zorkolot 我确实有一个问题,WHERE DateReading
  • 首先执行底部子查询(...) AS dT。从这里返回的是 [MaxDateCol] 和 ID。我在接收查询中使用“dT”别名来引用它:dT.ID, dT.MaxDateCol(参见参考资料?dT...该值来自底部子查询)。注意我又做了一个子查询-SELECT MAX(DateCol) FROM YourTable Y WHERE Y.DateCol &lt; dt.MaxDateCol。小于号 (
猜你喜欢
  • 1970-01-01
  • 2021-01-25
  • 2019-11-15
  • 2014-12-26
  • 2022-01-02
  • 1970-01-01
  • 2023-04-01
  • 2011-08-29
  • 2014-12-06
相关资源
最近更新 更多