【问题标题】:Selecting the difference between dates in a stored procedure using a subquery使用子查询在存储过程中选择日期之间的差异
【发布时间】:2020-09-30 09:44:48
【问题描述】:

我不知道这是否可能,但我觉得我以前可能做过,但丢失了那部分代码。我正在尝试制作一个包含子查询内部联接的 select 语句,以显示同一表中两个日期之间的天数。

数据结构的一个简单示例如下所示:

Name  ID  Date    Day       Hours
Bill  1   3/3/20  Thursday   8
Fred  2   4/3/20  Monday     6
Bill  1   8/3/20  Tuesday    2

根据这些数据,我想选择每一行加上一个额外的列,即每个 ID 的每一行的日期之间的天数。比如:

Select * from tblData
Inner join (datediff(Select Top(1) Date from tblData where Date < Date), Date) And ID = ID) 

或为简单起见:

Select * from tblData
Inner join (datediff(Select Top(1) Date from tblData where Date < 8/3/20), 8/3/20) And ID = 1)

生成的数据集如下所示:

Name  ID  Date    Day       Hours  DaysBtwn
Bill  1   3/3/20  Thursday   8     4 (Assuming there was an earlier row in the table)
Fred  2   4/3/20  Monday     6     5 (Assuming there was an earlier row in the table)
Bill  1   8/3/20  Tuesday    2     5 (Based on the previous row date being 3/3/20 for Bill)

这有意义吗?我是否试图以错误的方式做到这一点?我想对表中大约 600000 行执行此操作,因此效率是关键,所以如果有更好的方法来执行此操作,我愿意接受建议。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql datetime subquery inner-join window-functions


【解决方案1】:

你可以使用lag():

select t.*, datediff(day, lag(date) over(partition by id order by date), date) diff
from mytable t

【讨论】:

    【解决方案2】:

    我想你只是想要lag():

    select t.*,
           datediff(day,
                    lag(date) over (partition by name order by date),
                    date
                   ) as diff
    from tblData t;
    

    注意:如果要过滤数据,以便将结果集中的行用于lag() 但不在结果集中,请使用子查询:

    select t.*
    from (select t.*,
                 datediff(day,
                          lag(date) over (partition by name order by date),
                          date
                         ) as diff
          from tblData t
         ) t
    where date < '2020-08-03';
    

    还要注意将日期常量用作 YYYY-MM-DD 格式的字符串。

    【讨论】:

    • 这正是我想要的。非常感谢!
    猜你喜欢
    • 2012-06-18
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2023-03-02
    • 2018-05-31
    相关资源
    最近更新 更多