使用子查询选择存储过程中日期之间的差异
Selecting the difference between dates in a stored procedure using a subquery
我不知道这是否可能,但我觉得我以前可能做过,但丢失了那部分代码。我正在尝试制作一个 select 语句,其中包含子查询的内部联接,以显示来自相同 table.
的两个日期之间的天数
一个简单的数据结构示例如下:
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
基于此数据,我想 select 每行加上一个额外的列,即每个 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)
这是否有意义,我是否尝试以错误的方式执行此操作?我想在 table 中对大约 600000 行执行此操作,因此效率是关键,所以如果有更好的方法来执行此操作,我愿意接受建议。
您可以使用 lag()
:
select t.*, datediff(day, lag(date) over(partition by id order by date), date) diff
from mytable t
我想你只是想要 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 格式的字符串。
我不知道这是否可能,但我觉得我以前可能做过,但丢失了那部分代码。我正在尝试制作一个 select 语句,其中包含子查询的内部联接,以显示来自相同 table.
的两个日期之间的天数一个简单的数据结构示例如下:
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
基于此数据,我想 select 每行加上一个额外的列,即每个 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)
这是否有意义,我是否尝试以错误的方式执行此操作?我想在 table 中对大约 600000 行执行此操作,因此效率是关键,所以如果有更好的方法来执行此操作,我愿意接受建议。
您可以使用 lag()
:
select t.*, datediff(day, lag(date) over(partition by id order by date), date) diff
from mytable t
我想你只是想要 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 格式的字符串。