您好我在SQL Server 2008中有一个天气数据库,其中充满了每20分钟拍摄的天气观测数据。我想得到每小时的天气记录而不是每20分钟我如何过滤掉一些结果,所以结果只有每小时的第一次观察。
示例:
7:00:00
7:20:00
7:40:00
8:00:00
期望输出
7:00:00
8:00:00
答案 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