Sql 将最近的时间值转换为精确的小时数

Sql 将最近的时间值转换为精确的小时数,sql,sql-server,time,Sql,Sql Server,Time,我有一个有小时级记录的表,但它们不是精确的24小时,如下午1:00、下午2:00等。相反,我有24个以上的数据点,如2:18、2:38、3:10、3:45等 在我的最后一个数据集中,我只需要24个精确小时的数据点,我计划将最接近下一个小时的数据点作为该精确小时,并删除其他数据点。请参阅附件中的图像以获取清晰的参考 原始数据集: 而我希望最终的数据集是 最终预期: 所以,基本上我可能有一个小时范围内的多个数据点,我必须用下一个精确的小时设置最近的一个,然后删除另一个 任何关于这方面的线索都是我

我有一个有小时级记录的表,但它们不是精确的24小时,如下午1:00、下午2:00等。相反,我有24个以上的数据点,如2:18、2:38、3:10、3:45等

在我的最后一个数据集中,我只需要24个精确小时的数据点,我计划将最接近下一个小时的数据点作为该精确小时,并删除其他数据点。请参阅附件中的图像以获取清晰的参考

原始数据集:

而我希望最终的数据集是

最终预期:

所以,基本上我可能有一个小时范围内的多个数据点,我必须用下一个精确的小时设置最近的一个,然后删除另一个


任何关于这方面的线索都是我应该采取的方法。有什么方法可以达到同样的效果吗?

也许还有其他方法可以存档,但我的方法如下:-

  • 使用
    dateadd
    功能添加到达下一小时的额外分钟数

  • 使用
    Where
    子句,通过使用
    Min
    功能

演示:-

DDL和DML

结果:-

质疑

结果:-

一个选项是使用with,并获得下一个整小时:

;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