使用SQL SELECT,如何显示彼此分开设置时间的记录

时间:2016-09-29 09:40:16

标签: c# sql-server reportviewer

我目前正在忙着构建一个监视大量表的小应用程序。

每张表都包含PLC打入的温度值。

PLC每分钟发送一次数据。

客户希望在趋势表上绘制当天或一周的报告,并在图表下方显示一个表格,其中包含图表中显示的值。

所以挑战在于,如果你看一天(1440)甚至更糟的一周(10080),报告表将变得太长,并在趋势表上绘制A4 / Letter页面的宽度(甚至在风景中)至少可以说是愚蠢的。客户知道这一点,所以他问我是否可以每隔半小时绘制一次值。

这让我想到了我的问题;如何使用SELECT语句仅向我显示每30分钟的值?

示例表包含以下字段:

[ID] [int] IDENTITY(1,1) NOT NULL,
[Date] [datetime] NOT NULL CONSTRAINT [DF_SAPO_T3_Date]  DEFAULT (getdate()),
[Air1] [decimal](5, 2) NULL,
[Name] [varchar](50) NULL,
[Email] [varchar](100) NULL,
[Number] [nvarchar](16) NULL,
[InAlarm] [bit] NULL,

任何帮助都会很棒。 感谢

2 个答案:

答案 0 :(得分:2)

SELECT *
  FROM tableName      
  WHERE DATEPART(MI,[DATE]) % 30 = 0
     AND [DATE] < maxDate AND [DATE] > minDate

上面的sql将选择分钟为0或30(或30的任何其他倍数)的每个条目,假设您确实每分钟轮询,应该满足您的需要。它不会聚合中间的数据,所以如果你想要30分钟间隔的平均值,你需要一个不同的SQL。

答案 1 :(得分:2)

我认为你想要做的是计算每30分钟的平均值

    DECLARE @StartTime AS DATETIME = '20160101';
    DECLARE @EndTime AS DATETIME = '20160108';

    WITH SLOTS AS (SELECT @STARTTIME AS T 
                    UNION ALL
                    SELECT DATEADD(n,30,T) FROM SLOTS WHERE DATEADD(n,30,T) < @EndTime)

        select S.T, COALESCE(AVG(Y.AIR1),0) AS Av_Temp  from slots S LEFT join YourTable Y ON S.T <= Y.[Date] AND Y.Date < DATEADD(n,30,S.T)
        GROUP BY S.T

调整它以允许没有读数的插槽,可能 - 也许他们应该说N / A或不在那里