如何按小时或10分钟分组

cnd*_*cnd 159 sql t-sql group-by sql-server-2008

就像我一样

SELECT [Date]
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY [Date]
Run Code Online (Sandbox Code Playgroud)

我该如何指定小组期?

MS SQL 2008

第二次编辑

我尝试着

SELECT MIN([Date]) AS RecT, AVG(Value)
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY (DATEPART(MINUTE, [Date]) / 10)
  ORDER BY RecT
Run Code Online (Sandbox Code Playgroud)

将%10更改为/ 10.是否可以在没有毫秒的情况下进行日期输出?

cnd*_*cnd 200

终于完成了

GROUP BY
DATEPART(YEAR, DT.[Date]),
DATEPART(MONTH, DT.[Date]),
DATEPART(DAY, DT.[Date]),
DATEPART(HOUR, DT.[Date]),
(DATEPART(MINUTE, DT.[Date]) / 10)
Run Code Online (Sandbox Code Playgroud)

  • 我做了它'ROUND((DATEPART(MINUTE,DT.[Date])/ 5),0,1)*5`,这样当我查看数据时它与最近的时隙相关联 (11认同)
  • 年,月和日可以简化为"DATE(DT.[Date])". (7认同)

Mic*_*ael 57

我参加派对的时间已经很晚了,但这并没有出现在任何现有的答案中:

GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
Run Code Online (Sandbox Code Playgroud)
  • 10MINUTE条件是可以改变的任何号码并且DATEPART分别.
  • 这是一个DATETIME值,意思是:
    • 它可以在很长的时间间隔内正常工作 (年之间没有碰撞.)
    • SELECT将它包含在语句中将为您的输出提供一个列,其中包含在您指定的级别截断的漂亮输出.
SELECT   DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
                                                               AS [date_truncated],
         COUNT(*) AS [records_in_interval],
         AVG(aa.[value]) AS [average_value]
FROM     [friib].[dbo].[archive_analog] AS aa
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
ORDER BY [date_truncated]
Run Code Online (Sandbox Code Playgroud)

  • 我懂了。那么将其更改为“ / 20 * 20”是否与以20分钟为间隔收集数据相同?抱歉,我现在正在努力学习数学。 (2认同)
  • 对于 SECOND as DATEPART,我收到一条错误消息(“datediff 函数导致溢出。分隔两个日期/时间实例的日期部分的数量太大。尝试使用具有不太精确的日期部分的 datepart。”)。看来 MINUTE 是您可以通过此方法使用的最小日期部分。 (2认同)

tzu*_*zup 17

在T-SQL中,您可以:

SELECT [Date]
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY [Date], DATEPART(hh, [Date])
Run Code Online (Sandbox Code Playgroud)

要么

通过分钟使用 DATEPART(mi, [Date])

要么

使用10分钟DATEPART(mi, [Date]) / 10(像蒂莫西建议的那样)

  • 分钟除以10将按10分钟的间隔创建分组,这就是我所需要的.Modulo 10毫无意义. (3认同)

Tim*_*uri 13

间隔10分钟,你会的

GROUP BY (DATEPART(MINUTE, [Date]) / 10)
Run Code Online (Sandbox Code Playgroud)

正如tzup和Pieter888已经提到的......做一个小时的间隔,只是

GROUP BY DATEPART(HOUR, [Date])
Run Code Online (Sandbox Code Playgroud)

  • 分钟除以10将按10分钟的间隔创建分组,这就是我所需要的.Modulo 10毫无意义. (11认同)
  • 但在这里我将 1980 年的分钟与 2011 年的分钟组合在一起:SI 需要关心它。 (3认同)

Fra*_*itt 7

应该是这样的

select timeslot, count(*)  
from 
    (
    select datepart('hh', date) timeslot
    FROM [FRIIB].[dbo].[ArchiveAnalog]  
    ) 
group by timeslot
Run Code Online (Sandbox Code Playgroud)

(不是100%肯定语法 - 我更像是一个Oracle类型的人)

在Oracle中:

SELECT timeslot, COUNT(*) 
FROM
(  
    SELECT to_char(l_time, 'YYYY-MM-DD hh24') timeslot 
    FROM
    (
        SELECT l_time FROM mytab  
    )  
) GROUP BY timeslot 
Run Code Online (Sandbox Code Playgroud)


小智 6

作者给出的原始答案非常好.只是为了扩展这个想法,你可以做类似的事情

group by datediff(minute, 0, [Date])/10
Run Code Online (Sandbox Code Playgroud)

这将允许你分组更长的时间,然后60分钟,比如720,这是半天等.


N..*_*N.. 5

对于 MySQL:

GROUP BY
DATE(`your_date_field`),
HOUR(`your_date_field`),
FLOOR( MINUTE(`your_date_field`) / 10);
Run Code Online (Sandbox Code Playgroud)