检查两个日期之间的间隔

问题描述

我有一个表,其中包含从日期 a 到日期 b 的时间间隔。间隔以 30 分钟为单位,如下所示:

2021-02-22 00:00:00.000
2021-02-22 00:30:00.000
2021-02-22 01:00:00.000
2021-02-22 01:30:00.000
2021-02-22 02:00:00.000
2021-02-22 02:30:00.000
2021-02-22 03:00:00.000
[...]
2021-03-21 23:30:00.000

我必须每 30 分钟检查一次从我的 MIN(date) = 2021-02-22 00:00:00.000 到我的 MAX(date) = 2021-03-21 23:30:00.000 是否有记录。

每个日历周记录的 COUNT()336。每天 30 分钟 * 每周 7 天 = (24 * 2) * 7。
我试图检查每个日历周是否有 336 条记录,但如果一条记录丢失而一条记录存在两次,则计数为 336,但结果是错误的。

SELECT *
FROM (
         SELECT a,b,DATEPART(iso_week,interval_datetime) AS cw,COUNT(id)                             AS counts
         FROM data_table
         GROUP BY DATEPART(iso_week,interval_datetime),a,b
     ) AS xyz
WHERE counts <> 336;

是否有其他方法可以检查是否有重复记录并检查是否使用了每 30 分钟记录?也许没有“日期”表。

谢谢!

解决方法

WITH CTE(CHECK_TIME) AS
(
   SELECT '2021-02-22 00:00:00.000'
      UNION ALL
   SELECT'2021-02-22 00:30:00.000'
      UNION ALL
   SELECT'2021-02-22 01:00:00.000'
     UNION ALL
   SELECT'2021-02-22 01:30:00.000'
     UNION ALL
   SELECT'2021-02-22 02:00:00.000'
     UNION ALL
   SELECT'2021-02-22 02:30:00.000'
     UNION ALL
   SELECT'2021-02-22 03:00:00.000'
     UNION ALL
   SELECT '2021-02-22 03:18:00.000'--FAIL ROW
     UNION ALL
   SELECT'2021-02-22 03:00:00.000'--DOUBLED RECORD
  )
 SELECT C.CHECK_TIME,LAG(CHECK_TIME)OVER(ORDER BY C.CHECK_TIME)LAGG,ABS(DATEDIFF(MI,C.CHECK_TIME,LAG(CHECK_TIME)OVER(ORDER BY C.CHECK_TIME)))AS         MINUTES_DIFFERENCE
  FROM CTE AS C

您能否检查一下这种方法是否有助于隔离有问题的记录。我将其发布为答案,因为评论太长了

,

您可以使用 LEAD 获取下一个值,然后进行过滤以返回所有差距过大的值

SELECT *
FROM (
         SELECT a,b,interval_datetime,LEAD(interval_datetime) OVER (ORDER BY interval_datetime) AS nextInterval
         FROM data_table
     ) AS t
WHERE nextInterval IS NULL OR DATEDIFF(second,nextInterval) > 1800;