Mysql sql 实现两行数据相减的sql写法

须具备的数据库脚本:

CREATE TABLE `NewTable` (
`id`  bigint(20) NOT NULL AUTO_INCREMENT COMMENT '流水ID数据库自增字段' ,
`queue_name`  varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '队列名称' ,
`tenant_id`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '租户ID' ,
`user_id`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户ID' ,
`product_total_count`  bigint(20) NOT NULL COMMENT '生产消息总数' ,
`consume_total_count`  bigint(20) NOT NULL COMMENT '消费消息总数' ,
`consumer_count`  bigint(20) NOT NULL COMMENT '消费者数量' ,
`statistic_time`  datetime NOT NULL COMMENT '统计时间' ,
`create_time`  datetime NOT NULL COMMENT '记录创建时间' ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=4
ROW_FORMAT=COMPACT
;

两行相减的查询语句:
select 
	  t.id,
	  t.queue_name,
	  IFNULL(t.product_total_count - (select product_total_count from mq_rpt_queue_by_hour where id = t.id-1),0),
	  IFNULL(t.consume_total_count - (select consume_total_count from mq_rpt_queue_by_hour where id = t.id-1),0),
	  now(),
	  now(),
    t.product_total_count - t.consume_total_count,
		IFNULL((t.product_total_count - t.consume_total_count) - (select product_total_count - consume_total_count from mq_rpt_queue_by_hour where id = t.id-1),0),
		t.consumer_count
from mq_rpt_queue_by_hour t;
 
当你创建数据库脚本,并且初始化了数据,那么执行下面的SQL查询脚本就可以得出两行相减的结果了。

 

### 查找SQL语句中筛选时间差大于30分钟的数据方法 在不同的数据库管理系统(DBMS)中,处理时间差的方式有所不同。以下是针对几种常见数据库系统的解决方案。 #### SQL Server 在SQL Server中,可以利用 `DATEDIFF` 函数来计算两个时间字段之间的时间差。如果要查找时间差大于30分钟的数据,可以通过以下方式实现: ```sql SELECT * FROM your_table WHERE DATEDIFF(MINUTE, start_time_column, end_time_column) > 30; ``` 此查询通过 `DATEDIFF` 计算两列时间戳之间的分钟差,并筛选出超过30分钟的结果[^1]。 --- #### Oracle Oracle 中可以直接使用减法操作符 `-` 来获取两个 `TIMESTAMP` 类型字段间的时间间隔。为了判断时间差是否大于30分钟,可采用如下两种方法之一: ##### 方法一:直接相减并转换为秒数 ```sql SELECT * FROM transactions WHERE (txn_time - create_tm) * 24 * 60 > 30; -- 将天数转为分钟数再比较 ``` ##### 方法二:提取具体单位进行运算 ```sql SELECT * FROM transactions WHERE EXTRACT(SECOND FROM (txn_time - create_tm)) / 60 + EXTRACT(MINUTE FROM (txn_time - create_tm)) + EXTRACT(HOUR FROM (txn_time - create_tm)) * 60 > 30; ``` 这两种方法均能有效过滤出时间差大于30分钟的记录[^2]。 --- #### MySQL MySQL 提供了多种内置函数用于时间和日期的操作。其中一种高效的方法是结合窗口函数 `LEAD()` 和 `TIMEDIFF()` 或者直接使用 `TIMESTAMPDIFF()` 函数完成目标需求。 ##### 使用 LEAD() 和 TIMEDIFF() ```sql SELECT * FROM ( SELECT *, TIMESTAMPDIFF(MINUTE, GPS_TIME, LEAD(GPS_TIME) OVER (ORDER BY GPS_TIME)) AS time_diff_minutes FROM a_track ) subquery WHERE time_diff_minutes > 30 AND TRUCK_ID = '28734729376582836682378'; ``` 上述代码片段先通过子查询计算每条记录与其下一条记录间的分钟级时间差,随后在外层查询中进一步限定条件以选出符合条件的数据[^4]。 ##### 单纯依赖 TIMESTAMPDIFF() 另一种更简洁的做法仅需调用一次 `TIMESTAMPDIFF()` 即可达成目的: ```sql SELECT * FROM your_table WHERE ABS(TIMESTAMPDIFF(MINUTE, column1, column2)) > 30; ``` 这里假设 `column1` 和 `column2` 是待对比的时间字段名;ABS 确保无论顺序如何都能得到正向差距值。 --- #### PostgreSQL PostgreSQL 支持丰富的日期/时间功能,在该环境下执行相似的任务也十分简便。下面展示了一种典型写法: ```sql SELECT * FROM your_table WHERE AGE(end_time_column, start_time_column) >= INTERVAL '30 minutes'; -- OR alternatively use EXTRACT function to get total minute difference directly. SELECT * FROM your_table WHERE EXTRACT(EPOCH FROM (end_time_column - start_time_column)) / 60 > 30; ``` 第一种形式借助 `AGE()` 返回一个表示两者相对关系的标准时间段对象,而第二种则把原始差异转化为总秒数后再除以六十得出最终结果以便于比较. --- ### 总结 不同类型的 RDBMS 对应着各自独特的语法结构来进行此类操作,但核心理念一致——即找到恰当工具衡量指定范围内任意两点时刻间距大小进而施加相应约束条件加以检索匹配项集。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值