Sql 将最近的时间值转换为精确的小时数
我有一个有小时级记录的表,但它们不是精确的24小时,如下午1:00、下午2:00等。相反,我有24个以上的数据点,如2:18、2:38、3:10、3:45等 在我的最后一个数据集中,我只需要24个精确小时的数据点,我计划将最接近下一个小时的数据点作为该精确小时,并删除其他数据点。请参阅附件中的图像以获取清晰的参考 原始数据集: 而我希望最终的数据集是 最终预期: 所以,基本上我可能有一个小时范围内的多个数据点,我必须用下一个精确的小时设置最近的一个,然后删除另一个Sql 将最近的时间值转换为精确的小时数,sql,sql-server,time,Sql,Sql Server,Time,我有一个有小时级记录的表,但它们不是精确的24小时,如下午1:00、下午2:00等。相反,我有24个以上的数据点,如2:18、2:38、3:10、3:45等 在我的最后一个数据集中,我只需要24个精确小时的数据点,我计划将最接近下一个小时的数据点作为该精确小时,并删除其他数据点。请参阅附件中的图像以获取清晰的参考 原始数据集: 而我希望最终的数据集是 最终预期: 所以,基本上我可能有一个小时范围内的多个数据点,我必须用下一个精确的小时设置最近的一个,然后删除另一个 任何关于这方面的线索都是我
任何关于这方面的线索都是我应该采取的方法。有什么方法可以达到同样的效果吗?也许还有其他方法可以存档,但我的方法如下:-
- 使用
功能添加到达下一小时的额外分钟数dateadd
- 使用
子句,通过使用Where
功能Min
;WITH CTE AS
(
SELECT [Date],
DATEADD(MINUTE, 60 - DATEPART(MINUTE, [time]), [time]) [Time],
col1,
col2,
col3,
ROW_NUMBER() OVER(PARTITION BY DATEPART(HOUR, [time]) ORDER BY Date, Time DESC) rn
FROM Test
)
SELECT CASE WHEN [Time] = '00:00:00' THEN DATEADD(DAY, 1, [Date]) ELSE [Date] END [Date],
[Time],
col1,
col2,
col3
FROM CTE
WHERE rn = 1
结果:
Date Time col1 col2 col3
02.02.2017 02:00:00 w e r
02.02.2017 03:00:00 q w e
02.02.2017 04:00:00 b n m
时间列的数据类型是什么?您使用的是什么版本的sql server?@ZoharPeled数据类型是时间(7),我使用的是sql server 2014 Management Studio(12.0),感谢您的帮助。它看起来真的很有用,并尝试在我的场景中利用同样的功能。这里只提到一点,这篇文章将考虑到这样一个事实,即第23小时的估算最终将用于第二天。因此,日期需要相应地更新。例如,2017年2月2日23:48的数据点需要估计为2017年2月3日00:00。所以,相应的日期需要更新。谢谢ZOhar。它看起来真的很有用,并尝试在我的场景中利用同样的功能。这里只提到一点,这篇文章将考虑到这样一个事实,即第23小时的估算最终将用于第二天。因此,日期需要相应地更新。例如,2017年2月2日23:48的数据点需要估计为2017年2月3日00:00。因此,需要相应地更新日期,只需添加一个案例即可。我已经编辑了我的答案以包含它。
;WITH CTE AS
(
SELECT [Date],
DATEADD(MINUTE, 60 - DATEPART(MINUTE, [time]), [time]) [Time],
col1,
col2,
col3,
ROW_NUMBER() OVER(PARTITION BY DATEPART(HOUR, [time]) ORDER BY Date, Time DESC) rn
FROM Test
)
SELECT CASE WHEN [Time] = '00:00:00' THEN DATEADD(DAY, 1, [Date]) ELSE [Date] END [Date],
[Time],
col1,
col2,
col3
FROM CTE
WHERE rn = 1
Date Time col1 col2 col3
02.02.2017 02:00:00 w e r
02.02.2017 03:00:00 q w e
02.02.2017 04:00:00 b n m