在t-sql中迭代行

mzsu5hc0  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(295)

我尝试计算sql server中两个日期之间的差异。这个 startdate 是,如果“中断”=1,“自动”=0。这个 enddate 是下一个日期,其中“中断”=0,“自动”=1。我试着使用这个函数

DATEDIFF(startdate, enddate, ...)

例如,我有以下数据:

ID   Date                      Interrupt    Automatic
-------------------------------------------------------
15   2020-07-06 09:56:35.630        0           1
14   2020-07-06 09:56:35.630        1           0
13   2020-07-06 09:56:33.407        1           1
12   2020-07-06 09:56:32.490        1           0
11   2020-07-06 09:56:30.073        0           1
10   2020-07-06 09:56:30.073        1           1
 9   2020-07-06 09:56:29.070        1           1
 8   2020-07-06 09:56:26.867        1           1
 7   2020-07-06 09:56:26.867        1           0
 6   2020-07-06 09:56:25.863        0           1
 5   2020-07-06 09:56:23.897        1           0
 4   2020-07-06 09:56:23.500        1           1
 3   2020-07-06 09:56:19.340        1           0
 2   2020-07-06 09:56:17.003        0           1
 1   2020-07-06 09:56:16.220        1           1

在本例中,我要计算id为3的行和id为6-->datediff的行之间的差异(id3.date,id6.date,毫秒)
本例中的下一种情况是,id 11和id 7-->datediff(id7.date,id11.date,毫秒)的日期之间的差异
结果应该是这样的:

ID   Date                      Interrupt    Automatic    Interrupttime
    ------------------------------------------------------------------
15   2020-07-06 09:56:35.630        0           1
12   2020-07-06 09:56:32.490        1           0             3,140
11   2020-07-06 09:56:30.073        0           1
 7   2020-07-06 09:56:26.867        1           0             3,206         
 6   2020-07-06 09:56:25.863        0           1
 3   2020-07-06 09:56:19.340        1           0             6,523

不同的是以秒为单位的中断时间。数据集将在将来增长,所以我想创建一个用于自动计算的作业。
我的尝试失败了。我希望你能帮我计算一下中断时间。我提前感谢你。
致以最诚挚的问候
基督教的

kqhtkvqz

kqhtkvqz1#

嗯。使用累计最大值获取每行的开始日期。然后过滤到结束日期并计算差异:

select t.*, datediff(millisecond, start_date, date)
from (select t.*,
             max(case when interrupt = 1 and automatic = 0 then date end) over (order by id) as start_date
      from t
     ) t
where interrupt = 0 and automatic = 1;
t3irkdon

t3irkdon2#

如果我使用代码,我会得到以下回报:

ID, Date, Interrupt, Automatik, Startdate, Differenz
1   2020-06-07 09:56:35.630 0   1   NULL    NULL
5   2020-06-07 09:56:30.073 0   1   2020-06-07 09:56:35.630 -5557
10  2020-06-07 09:56:25.863 0   1   2020-06-07 09:56:35.630 -9767
14  2020-06-07 09:56:17.003 0   1   2020-06-07 09:56:35.630 -18627

最后一列取决于第一行的日期。开始日期在每种情况下是相同的。但是如果我们看这个例子,id3是一对id6,id7是一对id11,依此类推。每种情况都有一个开始和结束日期。

相关问题