【问题标题】:Check interval between two dates检查两个日期之间的间隔
【发布时间】:2021-02-10 09:56:35
【问题描述】:

我有一张表格,其中包含从日期 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 分钟的记录?也许没有“日期”表。

谢谢!

【问题讨论】:

  • 每 30 分钟是指记录之间不超过 30 分钟,还是从午夜 00:00 开始每 30 分钟有一个记录? IE。 00:15 和 00:50 和 01:25 可以吗?
  • 从 00:00 开始,然后每 30 分钟一次,直到 00:00 再一次,依此类推。干杯!
  • 这是我的第一选择还是第二选择?
  • 记录之间不超过 30 分钟,从午夜 00:00 开始每 30 分钟有一个记录

标签: sql-server date intervals


【解决方案1】:
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

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

【讨论】:

    【解决方案2】:

    您可以使用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, interval_datetime, nextInterval) > 1800;
    

    【讨论】:

      猜你喜欢
      • 2015-08-06
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 2022-01-23
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多