【发布时间】:2018-12-11 22:01:29
【问题描述】:
我有一个 datetime 列,在下一个数据之间有 5 分钟的间隔,但是我想查看该列是否包含小于 5 分钟的任何时间间隔,尤其是 5 秒。
例如:
- 有一个日期是
2018-05-04 19:21:46.000 - 下一行将显示
2018-05-04 19:26:46.000 - 和
2018-05-04 19:31:46.000。
但是,我们有时会得到如下行:
-
2018-05-04 19:36:46.000 - 然后
2018-05-04 19:36:51.000 - 然后
2018-05-04 19:36:56.000
什么 SQL 脚本最适合过滤列以区分错误数据(5 秒间隔)和正确数据(5 分钟间隔),尤其是在包含数千行的表中?
嗨@Andrea,谢谢。我有一些问题。 “q”代表什么?当我将查询重写为
SELECT ProductID, MyTimestamp, DATEDIFF(second, xMyTimestamp, MyTimestamp) as DIFFERENCE_IN_SECONDS
FROM (
SELECT *,
Lag(MyTimestamp) OVER (ORDER BY MyTimestamp, ProductID) as xMyTimestamp
FROM TableName
) q
WHERE xMyTimestamp IS NOT NULL and ProductID= 31928
我得到的结果不能准确计算时间。
+-----------+-------------------------+-----------------------+
| ProductID | MyTimestamp | DIFFERENCE_IN_SECONDS |
+-----------+-------------------------+-----------------------+
| 31928 | 2017-03-21 13:36:30.000 | 0 |
| 31928 | 2017-03-21 13:46:30.000 | 0 |
| 31928 | 2017-03-21 13:56:32.000 | 0 |
| 31928 | 2017-03-21 14:01:32.000 | 0 |
| 31928 | 2017-03-21 14:11:32.000 | 0 |
| 31928 | 2017-03-21 14:16:32.000 | 0 |
| 31928 | 2017-03-21 14:26:32.000 | 0 |
| 31928 | 2017-03-21 14:36:32.000 | 0 |
+-----------+-------------------------+-----------------------+
任何理由
【问题讨论】:
-
假设下一条记录是“正确的”,会是什么? 19:41:46 还是 19:41:56?
-
@WolfgangK,如果我正确理解了您的问题,则以秒为单位的差异字段中的正确记录不应读取为零,而是计算 Mytimestamp 中的后续值与 MyTimestamp 中的先前值之间的时间差场地。所以它应该是 600, 602, 300, 600, 300 等等,但它却是 0。
-
不,你没看懂我的问题,而且由于样本数据已经留下了问题,所以你不能。我的问题是:下一个“正确”值是在最后一个“正确”值之后 5 分钟还是在最后一个记录之后 5 分钟,无论它是否正确?对于“差异 0”:按 ProductID 分区并将其从 Order By 中删除。该问题的最可能原因是多个产品同时使用。
标签: sql-server tsql datetime sql-server-2014