我的表:
timestamp | value
------------------------+---------
2013-08-31 22:00:01.000 | 19.1
2013-08-31 22:00:03.000 | 21.5
...
由于我的数据系列中缺少秒数,我想计算每分钟的平均值。因此,我想在几分钟之内完成数据系列,而不是在几秒钟内完成数据系列,如下所示:
timestamp | value
-----------------+---------
2013-08-31 22:00 | 19.5
2013-08-31 22:01 | 21.1
...
我怎么能写一个给我这个结果的SQL查询?我正在使用SQL Server 2012.
答案 0 :(得分:1)
您可以使用格式为100的CONVERT()
删除秒数:
SELECT CONVERT(VARCHAR,GETDATE(),100) AS Dt
,AVG(value)
FROM YourTable
GROUP BY CONVERT(VARCHAR,GETDATE(),100)
如果需要,您可以重新投射为DATETIME()
:
CAST(CONVERT(VARCHAR,GETDATE(),100)AS DATETIME)
它有秒/毫秒,但它们都是零。
答案 1 :(得分:1)
从datetime到smalldatetime的转换避免了与日期到字符的最新转换相关的繁琐(并且计算速度慢)。以下将计算每分钟的平均值。
SELECT
cast(Timestamp as smalldatetime) Timestamp
,avg(value) Value
from PageLogs
group by cast(Timestamp as smalldatetime)
order by cast(Timestamp as smalldatetime)
缺点是四舍五入;这将转换21:00:30.000和22:01:29.997至22:00之间的值。如果您需要平均按"日历"分钟(22:00:00:00到22:00:59.997),您必须调整时间(毫秒级)以获得正确的断点,如下所示:
SELECT
cast(dateadd(ms, -30000, Timestamp) as smalldatetime) Timestamp
,avg(value) Value
from PageLogs
group by cast(dateadd(ms, -30000, Timestamp) as smalldatetime)
order by cast(dateadd(ms, -30000, Timestamp) as smalldatetime)
答案 2 :(得分:0)
Goat CO的回答是有效的,但是如果您需要在示例中使用确切的日期格式,则需要手动构建它:
select
convert(varchar, datepart(year, ts)) + '-' +
convert(varchar, datepart(month, ts)) + '-' +
convert(varchar, datepart(day, ts)) + ' ' +
convert(varchar, datepart(hour, ts)) + ':' +
convert(varchar, datepart(minute, ts)) as timestamp,
avg(value) as value
from
tbl
group by
datepart(year, ts),
datepart(month, ts),
datepart(day, ts),
datepart(hour, ts),
datepart(minute, ts)