![](/img/trans.png)
[英]How to uniquely identify a set of records each time I write to SQL Server database from C#
[英]Using SQL SELECT, how do I display records with set time apart from each other
我目前正忙于构建一个监视一堆表的小型应用程序。
每个表都包含一个由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,
任何帮助都会很棒。 谢谢
SELECT *
FROM tableName
WHERE DATEPART(MI,[DATE]) % 30 = 0
AND [DATE] < maxDate AND [DATE] > minDate
上面的sql将选择分钟为0或30(或30的任何其他倍数)的每个条目,假设您确实在每分钟轮询一次,则应满足您的需要。 但是,它不会汇总两者之间的数据,因此,如果您希望每个30分钟间隔的平均值,则需要使用另一条SQL。
我认为您要计算的是每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
对其进行了调整,以允许没有读数的插槽-也许他们应该说不适用或不在
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.