关于获取两次数据记录的差值可能大家在做报表的时候经常遇到,不知道大家是怎么处理的,比如获取每个小时的流量,获取每个小时的流量往往是通过与前一个小时的累计流量相减而得到的,如果在日报表中查询当天的流量数据就要往前多查寻一个小时的数据,也就是前一天的最后一个数据,比如每个小时记录一次数据,要查询0点的数据时,就要查询到前一天23点的数据,不知道大家是不是这样处理的?我这里有一个方法是在数据库中处理的,我在这里抛转引玉,大家也介绍一下自己的方法,相互学习。
下面是SQL数据库中的一段代码,用于创建一个事件触发器:
CREATE TRIGGER [dbo].[Trigger1] ON [dbo].[demo]
INSTEAD OF INSERT /*必须为INSTEAD OF触发器*/
AS
Declare @dt datetime /*时间*/
Declare @f1 char(50) /*标识*/
Declare @f2 real /*当前值*/
Declare @f21 real /*上次值*/
Declare @f3 real /*增加值*/
BEGIN
/*得到当前插入字段内容*/
SELECT @dt=dt,@f1=f1,@f2=f2 FROM inserted
/*置上次值为*/
SET @f21=0
/*通过查询最后条记录,得到上次值*/
SELECT TOP 1 @f21=f2 FROM demo WHERE f1=@f1 AND dt<@dt ORDER BY dt DESC
/*计算增加值*/
SET @f3=@f2-@f21
/*把当前记录记录及增加值插入表中*/
INSERT demo(dt,f1,f2,f3) VALUES(@dt,@f1,@f2,@f3)
END
这段程序的意思是创建一个触发事件替换Insert事件,当执行Insert事件是执行这个事件中的代码。
先说一下数据表结构吧,数据表如下图:

数据表为四列:分别为时间、变量名、当前值和增加值,当插入数据时,则进入上述代码,先获取插入字段的值,插入字段只要三个值,我们可以定义为时间、累计流量变量名和累计流量当前值,通过Select语句:SELECT TOP 1 @f21=f2 FROM demo WHERE f1=@f1 AND dt<@dt ORDER BY dt DESC获取上个记录的累计流量值,然后用当前累计流量值-上次累计流量值,获得每个小时的累计流量,然后用Inset demo 存入到数据表中。
以下为数据表插入数据SQL语句:
insert demo(dt,f1,f2) values('2022-03-31 13:00:00','进水累计流量',15000.0)
insert into demo(dt,f1,f2) values('2022-03-31 13:00:00','进水累计流量',15000.0)
INSERT INTO [dbo].[demo] ([dt],[f1],[f2]) VALUES ('2022-03-31 12:00:00','进水累计流量',12000.0)
三条语句意思是一样的
以下为数据表查询SQL语句:
SELECT TOP 1000 id,dt,f1,f2,f3 FROM [UserDatabase].[dbo].[demo] order by id asc
查询结果如下:
