MSSQL仅显示15分钟的间隔数据

时间:2017-09-21 08:22:41

标签: sql sql-server

我有一个每分钟测量的数据库,这个值是当时的当前流量。但我只想在查询中每15分钟显示一次测量结果。所以相反我只想在9:00,9:15等看到RecDate的值。我试图使用,但是我无法看到RecDate在值之间是什么,它会将它们添加到那段时间。我还尝试了其他一些东西,但我想我可能使用了错误的方法。

我目前有这段代码,看看总流量。

canActivate() {
  if (this.localStorage.get('user')) {
    return true
  } 
  this.router.navigate([ '/login' ]) return false;
} 

这会在我的表格中给出这些值。

SELECT rv.RecDate, sum(rv.Value_num) as TotalSUM
FROM         dbo.Channels c INNER JOIN
                          (SELECT     rv.*, TRY_CONVERT(numeric(20, 4), rv.Value) AS value_num, (LEFT(TRY_CONVERT(datetime2(0), rv.Timestamp), 16)) AS RecDate
                            FROM          dbo.RecordedValues rv) rv ON c.SourceId = rv.SourceId AND c.Id = rv.ChannelId
WHERE     
(c.Tag LIKE N'%1%'
OR c.Tag LIKE N'%2%'
OR c.Tag LIKE N'%3%'
OR c.Tag LIKE N'%4%')
AND Timestamp BETWEEN DATEADD(day,-1,GETDATE()) AND GETDATE()
Group BY rv.RecDate

我怎么能得到这个?:

RecDate             TotalSum
2017-09-20 10:02|   900
2017-09-20 10:03|   1000
2017-09-20 10:04|   950
2017-09-20 10:05|   975
2017-09-20 10:06|   960
etc.

2 个答案:

答案 0 :(得分:1)

你也可以像下面这样使用datepart来获得15分钟的间隔

datepart(minute,timestamp)%15=0

您还可以使用numbers表格预填充下面的表格

select DATEADd(MI,number,
Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))),Number
from numbers
where number%15=0

会给我以下结果

 2017-09-21 00:00:00.000
    2017-09-21 00:15:00.000
    2017-09-21 00:30:00.000
    2017-09-21 00:45:00.000
    2017-09-21 01:00:00.000
    2017-09-21 01:15:00.000
    2017-09-21 01:30:00.000
    2017-09-21 01:45:00.000

现在您可以使用联接来获得所需的结果

;with cte
as
(
select DATEADd(MI,number,Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))) as dt
from numbers
where number%15=0
)
,cte1
(
your query
)
select * from cte c
join cte1 c1
on c.dt=c1.datecolumn

如果您可以实现数字表的结果(根据需要更改日期)并创建索引,这可能会很好用

答案 1 :(得分:0)

您可以在子查询中使用VALUES

SELECT
    B.TempCol,
    SUM(B.Value) AS SumValue
FROM
(
    SELECT              
        A.Value,
        CONCAT(CONVERT(DATE, A.RecDate),' ', DATEPART(HOUR, A.RecDate), ':', (SELECT TOP 1 T.Title FROM (VALUES (15, '00'), (30, '15'), (45, '30'), (60, '00')) T(Id, Title) WHERE DATEPART(MINUTE, A.RecDate) < T.Id)) TempCol
    FROM 
        YourTable A
) B
GROUP BY    
    B.TempCol

使用下表,找到日期的时间范围。

(VALUES (15, '00'), (30, '15'), (45, '30'), (60, '00'))

结果:

2017-09-20 10:02 -> 2017-09-20 10:00
2017-09-20 10:17 -> 2017-09-20 10:15
2017-09-20 10:46 -> 2017-09-20 10:45