SQL按小时获取数据

时间:2015-12-28 23:28:32

标签: sql sql-server

您好我在SQL Server 2008中有一个天气数据库,其中充满了每20分钟拍摄的天气观测数据。我想得到每小时的天气记录而不是每20分钟我如何过滤掉一些结果,所以结果只有每小时的第一次观察。

示例:

7:00:00
7:20:00
7:40:00
8:00:00

期望输出

7:00:00 
8:00:00

5 个答案:

答案 0 :(得分:1)

要准确得到(更少的事实是它是INT而不是TIME;没有什么难以修复的)你列出的所需结果,

SELECT DISTINCT DATEPART(HOUR, TimeStamp)
FROM Observations

如果您也想要,也可以添加CAST(TimeStamp AS DATE)

假设您也想要数据,但它有点依赖,但从您所描述的内容来看,简单的解决方案只是说:

SELECT *
FROM Observations
WHERE DATEPART(MINUTE, TimeStamp) = 0

如果您缺少数据,则会失败,这很常见。

如果你确实有几个小时想要数据,但是没有一行:00,你可以这样做:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CAST(TimeStamp AS DATE), DATEPART(HOUR, TimeStamp) ORDER BY TimeStamp)
    FROM Observations
)

SELECT *
FROM cte
WHERE n = 1

对于任何日期/小时组合,这将是第一个。

当然,你仍然遗漏了整整一小时没有数据的事情。如果你想要返回那些实例,那就需要一个数字表。

答案 1 :(得分:0)

您可以使用类似下面的公式来获取时间点的最近小时(在这种情况下,它是GETUTCDATE())。

SELECT  DATEADD(MINUTE, DATEDIFF(MINUTE, 0, GETUTCDATE()) / 60 * 60, 0)

然后,您可以在SQL查询的WHERE子句中使用此公式来获取所需的数据。

答案 2 :(得分:0)

您需要的是GROUP BY您期望的时间范围,例如日期和时间。然后,您将获得时间范围的MIN值。既然你没有指定你正在使用的列,这是我能给出的最通用的东西。

答案 3 :(得分:0)

用作过滤器:

... where DATEPART(MINUTE, DateColumn) = 0

答案 4 :(得分:0)

要过滤每整个小时的结果,您可以将where子句设置为检查00分钟,因为每整个小时都是HH:00:00。

要从时间戳中获取分钟部分,您可以使用DATEPART功能。

SELECT * 
FROM YOURTABLENAME
WHERE DATEPART(MINUTE, YOURDATEFIELDNAME) = 0

有关datepart函数的更多信息,请访问:http://www.w3schools.com/sql/func_datepart.asp