我目前正在忙着构建一个监视大量表的小应用程序。
每张表都包含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,
任何帮助都会很棒。 感谢
答案 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或不在那里