Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 您如何按任何时间间隔进行分组?_Sql Server_Sql Server 2014 - Fatal编程技术网

Sql server 您如何按任何时间间隔进行分组?

Sql server 您如何按任何时间间隔进行分组?,sql-server,sql-server-2014,Sql Server,Sql Server 2014,在SQL SERVER中,如何按任何基于时间的间隔进行分组 为了节省别人的时间,我想出了这个解决方案,对我来说,效果非常好。您可以生成任意时基,然后按任意间隔分组。非常适合做时间加权平均。如果有人有更好的方法做这件事,我很想听到你的声音 小时数 会议记录 注意。 您可以将时间间隔设置为60小时,1440天 declare @startdate datetime2 declare @enddate datetime2 declare @interval int set @startdate = '

在SQL SERVER中,如何按任何基于时间的间隔进行分组

为了节省别人的时间,我想出了这个解决方案,对我来说,效果非常好。您可以生成任意时基,然后按任意间隔分组。非常适合做时间加权平均。如果有人有更好的方法做这件事,我很想听到你的声音

小时数

会议记录

注意。 您可以将时间间隔设置为60小时,1440天

declare @startdate datetime2
declare @enddate datetime2
declare @interval int
set @startdate = '2017-01-01 00:00:00'
set @enddate   = '2017-01-31 00:00:00'
set @interval = 7
;with 
ALL_INTERVALS 
AS (
    SELECT TOP (DATEDIFF(MINUTE,@startdate,@enddate))
    TIMES = DATEADD(MINUTE,CONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id])),@startdate),
    1 AS VALUE
        FROM sys.all_objects AS s1
        CROSS JOIN
        sys.all_objects AS s2
)
select DATEADD(MINUTE,((DATEDIFF(MINUTE, @startdate,TIMES)/@interval)*@interval),@startdate) AS TIMES,SUM(VALUE) AS TESTDATA 
from ALL_INTERVALS
group by DATEADD(MINUTE,((DATEDIFF(MINUTE, @startdate,TIMES)/@interval)*@interval),@startdate)
order by DATEADD(MINUTE,((DATEDIFF(MINUTE, @startdate,TIMES)/@interval)*@interval),@startdate)

我认为你把事情复杂化了。
您可以使用
分组依据(DATEDIFF(MINUTE,'2017-01-01',the DateTime)/30
每30分钟分组一次。当然,我选择的日期只是一个随机日期。如果需要,您可以选择示例数据中的第一个(或最后一个)日期。
您还可以使用此技术获取任何时间段的每个间隔-只需将关键字
MINUTE
更改为您想要使用的任何日期段,将intreval
30
更改为您想要的任何间隔

考虑以下示例数据:

;WITH CTE AS 
(
    SELECT CAST('2017-01-01T00:00:00' as datetime) As TheDateTime, 0 as rn
    UNION ALL
    SELECT DATEADD(MINUTE, 1, TheDateTime), rn + 1
    FROM CTE
    WHERE rn < 60
)

SELECT TheDateTime, rn INTO #T
FROM CTE
OPTION(MAXRECURSION 0)
要获得30分钟分组的最大rn,您只需要以下内容:

SELECT DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)
FROM #T
GROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
结果:

interval    max_rn
0           29
1           59
2           60

我认为你把事情复杂化了。
您可以使用
分组依据(DATEDIFF(MINUTE,'2017-01-01',the DateTime)/30
每30分钟分组一次。当然,我选择的日期只是一个随机日期。如果需要,您可以选择示例数据中的第一个(或最后一个)日期。
您还可以使用此技术获取任何时间段的每个间隔-只需将关键字
MINUTE
更改为您想要使用的任何日期段,将intreval
30
更改为您想要的任何间隔

考虑以下示例数据:

;WITH CTE AS 
(
    SELECT CAST('2017-01-01T00:00:00' as datetime) As TheDateTime, 0 as rn
    UNION ALL
    SELECT DATEADD(MINUTE, 1, TheDateTime), rn + 1
    FROM CTE
    WHERE rn < 60
)

SELECT TheDateTime, rn INTO #T
FROM CTE
OPTION(MAXRECURSION 0)
要获得30分钟分组的最大rn,您只需要以下内容:

SELECT DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)
FROM #T
GROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
结果:

interval    max_rn
0           29
1           59
2           60

当需要亚分钟粒度时,也可以使用秒,并且
DATEDIFF
span中的时间不超过30年。这很好,非常感谢您的发布。我的“选择所有系统对象”在开始日期和结束日期之间相差3或4年后中断。您的每次都有效。也可以使用需要亚分钟粒度的秒数,并且
DATEDIFF
span中的时间不超过30年。这很好,非常感谢您的发布。我的Select all sys对象在开始日期和结束日期相差3或4年后中断。您的每次都有效。