TDengine TIMEDIFF() 函数用户使用手册

在这里插入图片描述

TDengine TIMEDIFF() 函数详细使用手册

目录

  • 功能概述
  • 函数语法
  • 参数说明
  • 返回值说明
  • 版本变更说明
  • 技术特性
  • 使用场景及示例
  • 时间单位处理
  • 数据类型兼容性
  • 注意事项
  • 常见问题
  • 最佳实践

功能概述

TIMEDIFF() 函数用于计算两个时间戳的差值,返回 expr1 - expr2 的结果。结果可能为负值,并可以近似到指定的时间单位。该函数在时序数据分析中特别有用,可以用于计算事件间隔、数据延迟、持续时间等场景。

函数语法

TIMEDIFF(expr1, expr2 [, time_unit])

参数说明

参数类型说明是否必需
expr1BIGINT、TIMESTAMP、VARCHAR、NCHAR时间戳表达式(被减数)
expr2BIGINT、TIMESTAMP、VARCHAR、NCHAR时间戳表达式(减数)
time_unitSTRING返回结果的时间单位,可选参数

计算公式

结果 = expr1 - expr2 (以 time_unit 为单位)

返回值说明

  • 数据类型:BIGINT
  • 计算结果:expr1 与 expr2 的差值,以指定时间单位表示
  • 正负值
    • 正值:expr1 > expr2
    • 负值:expr1 < expr2
    • 零值:expr1 = expr2
  • NULL处理:当 expr1 或 expr2 为 NULL 时,返回 NULL

版本变更说明

⚠️ 重要版本差异

v3.3.3.0 之前版本

  • 返回结果为 绝对值(始终为正数)
  • 计算公式:ABS(expr1 - expr2)

v3.3.3.0 及之后版本

  • 返回结果可能为 负值
  • 计算公式:expr1 - expr2
-- 示例:版本行为差异
SELECT TIMEDIFF('2025-09-03 10:00:00', '2025-09-03 10:05:00', 1s) as `时间差`;-- v3.3.3.0 之前:返回 300 (绝对值)
-- v3.3.3.0 及之后:返回 -300 (真实差值)

技术特性

支持的数据类型

expr1 和 expr2 支持的类型:
  1. BIGINT:时间戳数值
  2. TIMESTAMP:标准时间戳类型
  3. VARCHAR/NCHAR:符合 ISO8601/RFC3339 标准的日期时间格式字符串
支持的时间格式示例:
-- ISO8601 格式
'2025-09-03T10:30:45.123Z'
'2025-09-03T10:30:45+08:00'-- RFC3339 格式  
'2025-09-03 10:30:45.123'
'2025-09-03 10:30:45'-- 时间戳数值(根据数据库精度)
1693737045123  -- 毫秒时间戳
1693737045123456  -- 微秒时间戳

支持的时间单位

时间单位符号说明换算关系
纳秒1bnanosecond基础单位
微秒1umicrosecond1,000 纳秒
毫秒1amillisecond1,000,000 纳秒
1ssecond1,000,000,000 纳秒
分钟1mminute60 秒
小时1hhour60 分钟
1dday24 小时
1wweek7 天

时间精度规则

  • 输入时间戳精度:由所查询表的精度确定
  • 未指定表时:默认精度为毫秒
  • 最小时间单位:不能小于数据库的时间分辨率
  • 未指定 time_unit:使用数据库的时间分辨率作为时间单位

使用场景及示例

1. 基础时间差计算

-- 创建简单的事件表
CREATE STABLE events (ts TIMESTAMP,event_name NCHAR(50)
) TAGS (device_id INT);CREATE TABLE device_01 USING events TAGS (1);-- 插入测试数据
INSERT INTO device_01 VALUES ('2025-09-03 10:00:00', '开机'),('2025-09-03 10:30:00', '运行'),('2025-09-03 11:00:00', '关机');
简单的时间差计算
-- 计算每个事件距离开机时间的差值
SELECT ts,event_name,TIMEDIFF(ts, '2025-09-03 10:00:00', 1m) as `分钟差`,TIMEDIFF(ts, '2025-09-03 10:00:00', 1s) as `秒数差`
FROM device_01
ORDER BY ts;

输出结果

+---------------------+-----------+--------+--------+
| ts                  | event_name| 分钟差 | 秒数差 |
+---------------------+-----------+--------+--------+
| 2025-09-03 10:00:00 | 开机      | 0      | 0      |
| 2025-09-03 10:30:00 | 运行      | 30     | 1800   |
| 2025-09-03 11:00:00 | 关机      | 60     | 3600   |
+---------------------+-----------+--------+--------+

2. 不同数据类型的使用

-- 字符串格式时间
SELECT TIMEDIFF('2025-09-03 11:00:00', '2025-09-03 10:00:00', 1h) as `小时差`;
-- 结果: 1-- 时间戳数值(毫秒)
SELECT TIMEDIFF(1693742400000, 1693738800000, 1h) as `小时差`;
-- 结果: 1-- 混合类型
SELECT TIMEDIFF('2025-09-03 11:00:00', 1693738800000, 1m) as `分钟差`;
-- 结果: 60

3. 正负值示例

-- 正值:第一个时间大于第二个时间
SELECT TIMEDIFF('2025-09-03 11:00:00', '2025-09-03 10:00:00', 1h) as `正值`;
-- 结果: 1-- 负值:第一个时间小于第二个时间  
SELECT TIMEDIFF('2025-09-03 10:00:00', '2025-09-03 11:00:00', 1h) as `负值`;
-- 结果: -1-- 零值:时间相同
SELECT TIMEDIFF('2025-09-03 10:00:00', '2025-09-03 10:00:00', 1h) as `零值`;
-- 结果: 0

4. 不同时间单位的转换

-- 同一时间差用不同单位表示
SELECT TIMEDIFF('2025-09-03 10:05:30', '2025-09-03 10:00:00', 1s) as ``,TIMEDIFF('2025-09-03 10:05:30', '2025-09-03 10:00:00', 1m) as `分钟`,TIMEDIFF('2025-09-03 10:05:30', '2025-09-03 10:00:00', 1a) as `毫秒`;

输出结果

+-----+------+-------+
| 秒  | 分钟 | 毫秒  |
+-----+------+-------+
| 330 | 5    | 330000|
+-----+------+-------+

5. 传感器数据简单分析

-- 创建温度传感器表
CREATE STABLE temperature (ts TIMESTAMP,temp FLOAT
) TAGS (sensor_id INT);CREATE TABLE sensor_01 USING temperature TAGS (1);-- 插入数据
INSERT INTO sensor_01 VALUES ('2025-09-03 14:00:00', 25.0),('2025-09-03 14:05:00', 26.0),('2025-09-03 14:10:00', 24.5);-- 计算采集间隔
SELECT ts,temp,TIMEDIFF(ts, '2025-09-03 14:00:00', 1m) as `经过分钟数`
FROM sensor_01
ORDER BY ts;

6. NULL 值处理

-- NULL 值示例(基于实际测试结果)
SELECT TIMEDIFF(NULL, NULL, 1h) as `结果1`;
-- 结果: NULLSELECT TIMEDIFF('2025-09-03 11:00:00', NULL, 1h) as `结果2`;
-- 结果: NULLSELECT TIMEDIFF(NULL, '2025-09-03 10:00:00', 1s) as `结果3`;
-- 结果: NULLSELECT TIMEDIFF('2025-09-03 10:00:00', '2025-09-03 09:00:00', NULL) as `结果4`;
-- 结果: 使用默认单位(数据库精度)

7. 错误格式处理

-- 有效格式
SELECT TIMEDIFF('2025-09-03 10:00:00', '2025-09-03 09:00:00', 1h) as `有效格式`;
-- 结果: 1-- 无效格式(返回 NULL)
SELECT TIMEDIFF('2025/09/03 10:00:00', '2025/09/03 09:00:00', 1h) as `无效格式`;
-- 结果: NULL

8. 实际应用场景

设备运行时长统计
-- 计算设备今天的运行时长
SELECT '设备运行时长' as `统计项目`,TIMEDIFF(NOW(), '2025-09-03 08:00:00', 1h) as `运行小时数`,TIMEDIFF(NOW(), '2025-09-03 08:00:00', 1m) as `运行分钟数`;
数据延迟监控
-- 检查数据是否及时到达
SELECT ts,temp,TIMEDIFF(NOW(), ts, 1m) as `延迟分钟数`,CASE WHEN TIMEDIFF(NOW(), ts, 1m) > 10 THEN '数据延迟'ELSE '正常'END as `状态`
FROM sensor_01
ORDER BY ts DESC;
事件持续时间
-- 计算事件持续时间
SELECT '系统维护' as `事件`,'2025-09-03 02:00:00' as `开始时间`,'2025-09-03 04:30:00' as `结束时间`,TIMEDIFF('2025-09-03 04:30:00', '2025-09-03 02:00:00', 1h) as `持续小时`,TIMEDIFF('2025-09-03 04:30:00', '2025-09-03 02:00:00', 1m) as `持续分钟`;

时间单位处理

1. 时间单位精度限制

-- 时间单位不能小于数据库精度
-- 假设数据库精度为毫秒(ms)SELECT TIMEDIFF('2025-09-03 10:00:01.000', '2025-09-03 10:00:00.000', 1a) as `有效毫秒`,   -- 有效TIMEDIFF('2025-09-03 10:00:01.000', '2025-09-03 10:00:00.000', 1u) as `微秒近似`, -- 可能无效或近似TIMEDIFF('2025-09-03 10:00:01.000', '2025-09-03 10:00:00.000', 1b) as `纳秒近似`; -- 可能无效或近似

2. 时间单位近似处理

-- 时间差的近似处理示例
SELECT ts,-- 精确到秒的计算TIMEDIFF(ts, '2025-09-03 10:00:00.000', 1s) as `秒数精确`,-- 精确到分钟的计算(会进行近似)TIMEDIFF(ts, '2025-09-03 10:00:00.000', 1m) as `分钟近似`
FROM device_01;

数据类型兼容性

1. 时间戳数值与字符串混用

-- 创建包含不同时间戳格式的表
CREATE TABLE mixed_time_data (ts TIMESTAMP,ts_bigint BIGINT,ts_varchar VARCHAR(30),value FLOAT
);-- 插入混合格式数据
INSERT INTO mixed_time_data VALUES ('2025-09-03 10:00:00.000', 1693737600000, '2025-09-03 10:00:00', 100.0),('2025-09-03 10:05:00.000', 1693737900000, '2025-09-03 10:05:00', 200.0);-- 混合类型的时间差计算
SELECT -- TIMESTAMP 与 VARCHARTIMEDIFF(ts, ts_varchar, 1s) as `时间戳与字符串差`,-- BIGINT 与 TIMESTAMP  TIMEDIFF(ts_bigint, ts, 1s) as `数值与时间戳差`,-- VARCHAR 与 BIGINTTIMEDIFF(ts_varchar, ts_bigint, 1s) as `字符串与数值差`
FROM mixed_time_data;

2. 不同精度数据库的行为

-- 微秒精度数据库
CREATE DATABASE microsec_db PRECISION 'us';
USE microsec_db;-- 在微秒精度下的计算
SELECT TIMEDIFF('2025-09-03 10:00:00.123456', '2025-09-03 10:00:00.123000', 1u) as `微秒差`;
-- 结果:456-- 纳秒精度数据库  
CREATE DATABASE nanosec_db PRECISION 'ns';
USE nanosec_db;-- 在纳秒精度下的计算
SELECT TIMEDIFF('2025-09-03 10:00:00.123456789', '2025-09-03 10:00:00.123456000', 1b) as `纳秒差`;
-- 结果:789

注意事项

1. 版本兼容性

-- 检查 TDengine 版本
SELECT SERVER_VERSION();-- 针对不同版本的兼容性处理
-- v3.3.3.0 之前:需要手动处理负值
SELECT CASE WHEN expr1 >= expr2 THEN TIMEDIFF(expr1, expr2, 1s)ELSE -TIMEDIFF(expr2, expr1, 1s)  -- 手动处理负值END as `兼容差值`
FROM some_table;-- v3.3.3.0 及之后:直接使用
SELECT TIMEDIFF(expr1, expr2, 1s) as `现代差值` FROM some_table;

2. 时区处理

-- TDengine 中的时间戳处理建议
-- 确保输入的时间字符串格式一致
SELECT TIMEDIFF('2025-09-03T10:00:00+08:00', '2025-09-03T02:00:00Z', 1h) as `时区差`;

3. NULL 值处理的最佳实践

-- 安全的 NULL 值处理
SELECT ts,temp,CASE WHEN TIMEDIFF(NOW(), ts, 1m) IS NULL THEN -1ELSE TIMEDIFF(NOW(), ts, 1m)END as `延迟分钟数`
FROM sensor_01;-- 数据有效性检查
SELECT ts,temp,CASE WHEN ts IS NULL THEN '时间为空'WHEN TIMEDIFF(NOW(), ts, 1m) IS NULL THEN '计算失败'WHEN TIMEDIFF(NOW(), ts, 1m) < 0 THEN '未来时间'WHEN TIMEDIFF(NOW(), ts, 1m) > 1440 THEN '超过24小时'ELSE '正常'END as `数据状态`
FROM sensor_01;

常见问题

Q1: TIMEDIFF 的参数顺序是什么?

答案TIMEDIFF(expr1, expr2, time_unit)

  • expr1:被减数(结束时间)
  • expr2:减数(开始时间)
  • 结果 = expr1 - expr2
-- 正确理解参数顺序
SELECT TIMEDIFF('2025-09-03 10:05:00', '2025-09-03 10:00:00', 1s) as `300`,TIMEDIFF('2025-09-03 10:00:00', '2025-09-03 10:05:00', 1s) as `300`;

Q2: 如何处理版本差异?

-- 创建兼容的查询方式
SELECT CASE WHEN expr1 >= expr2 THEN TIMEDIFF(expr1, expr2, 1s)ELSE -TIMEDIFF(expr2, expr1, 1s)END as `兼容结果`
FROM your_table;

Q3: 为什么某些时间格式返回 NULL?

答案:TIMEDIFF 对时间格式要求严格,必须符合 ISO8601/RFC3339 标准。

-- 有效格式
SELECT TIMEDIFF('2025-09-03 10:00:00', '2025-09-03 09:00:00', 1h);     -- 返回 1
SELECT TIMEDIFF('2025-09-03T10:00:00Z', '2025-09-03T09:00:00Z', 1h);   -- 返回 1-- 无效格式  
SELECT TIMEDIFF('2025/09/03 10:00:00', '2025/09/03 09:00:00', 1h);     -- 返回 NULL
SELECT TIMEDIFF('09-03-2025 10:00:00', '09-03-2025 09:00:00', 1h);     -- 返回 NULL

Q4: 如何选择合适的时间单位?

-- 根据应用场景选择时间单位
-- 高频监控:使用毫秒或微秒
SELECT TIMEDIFF(end_time, start_time, 1a) as `响应时间毫秒` FROM api_logs;-- 业务分析:使用秒或分钟
SELECT TIMEDIFF(logout_time, login_time, 1m) as `会话时长分钟` FROM user_sessions;-- 长期统计:使用小时或天
SELECT TIMEDIFF(current_date, created_date, 1d) as `活跃天数` FROM user_accounts;

常用时间单位速查

单位符号含义示例
1sTIMEDIFF(end_time, start_time, 1s)
1m分钟TIMEDIFF(end_time, start_time, 1m)
1h小时TIMEDIFF(end_time, start_time, 1h)
1dTIMEDIFF(end_time, start_time, 1d)
1a毫秒TIMEDIFF(end_time, start_time, 1a)

最佳实践

1. 数据类型统一

-- 推荐:在表设计时统一使用 TIMESTAMP 类型
CREATE STABLE sensor_data (ts TIMESTAMP,                    -- 统一的时间戳类型temperature FLOAT,humidity FLOAT
) TAGS (device_id INT, location NCHAR(50));-- 避免:混用多种时间类型
CREATE STABLE mixed_data (ts_timestamp TIMESTAMP,ts_varchar VARCHAR(30),          -- 避免ts_bigint BIGINT,               -- 避免value FLOAT
) TAGS (id INT);

2. 错误处理机制

-- 建立完善的错误处理
SELECT ts,event_name,CASE WHEN TIMEDIFF(NOW(), ts, 1s) IS NULL THEN 0ELSE TIMEDIFF(NOW(), ts, 1s)END as `安全时间差`
FROM events
ORDER BY ts;

3. 选择合适的时间单位

-- 短时间间隔用秒或分钟
SELECT TIMEDIFF('10:05:00', '10:00:00', 1m);  -- 5分钟-- 长时间间隔用小时或天  
SELECT TIMEDIFF('2025-09-04', '2025-09-03', 1d);  -- 1天

4. 处理可能的 NULL 值

-- 方法1:使用 CASE WHEN 提供默认值
SELECT ts,temp,CASE WHEN TIMEDIFF(NOW(), ts, 1m) IS NULL THEN 0ELSE TIMEDIFF(NOW(), ts, 1m)END as `延迟分钟数`
FROM sensor_01;-- 方法2:在 WHERE 子句中过滤 NULL
SELECT ts,temp,TIMEDIFF(NOW(), ts, 1m) as `延迟分钟数`
FROM sensor_01
WHERE TIMEDIFF(NOW(), ts, 1m) IS NOT NULL;-- 方法3:确保输入参数不为 NULL
SELECT TIMEDIFF(CASE WHEN end_time IS NULL THEN NOW() ELSE end_time END,CASE WHEN start_time IS NULL THEN '2025-09-03 00:00:00' ELSE start_time END,1m) as `安全的分钟差`
FROM some_table;

总结

TIMEDIFF() 函数是 TDengine 中功能强大的时间差计算工具:

核心特性

  • 灵活的数据类型支持:TIMESTAMP、BIGINT、VARCHAR/NCHAR
  • 多样的时间单位:从纳秒到周的完整时间单位支持
  • 版本演进:v3.3.3.0 版本重要变更(支持负值)
  • 精度适配:自动适配数据库时间精度设置

关键优势

  • 类型兼容性强:支持多种时间数据类型混合计算
  • 精度控制灵活:可指定返回结果的时间单位
  • 错误处理完善:无效格式和 NULL 值的妥善处理
  • 性能表现优异:适合大规模时序数据分析

应用建议

  • 根据业务场景选择合适的时间单位
  • 注意版本差异对结果符号的影响
  • 统一使用 TIMESTAMP 类型以获得最佳性能
  • 建立完善的错误处理和数据质量检查机制

正确使用 TIMEDIFF() 函数可以大大提升时序数据分析的效率和准确性,是 TDengine 时间序列处理的重要工具。

关于 TDengine

TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。

它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921244.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:栈和队列(上)

汇总代码见&#xff1a;登录 - Gitee.com 上一篇文章&#xff1a;数据结构&#xff1a;双向链表-CSDN博客 与本文相关的结构体传参&#xff1a;自定义类型&#xff1a;结构体-CSDN博客 1.栈 1.1概念和结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端…

文档抽取技术:提取非结构化文档中的关键信息,提升档案管理、金融保险和法律合规领域的效率与准确性

在信息爆炸的时代&#xff0c;各种机构、企业等都面临着海量非结构化文档数据的挑战。报告、合同、票据、档案记录、法律文书等文档中蕴藏着巨大的数据&#xff0c;但传统依靠人工阅读、理解和录入的方式效率低下、成本高昂且容易出错。文档抽取技术作为人工智能和自然语言处理…

雷柏VT1 MAX评测:原生中小手形电竞鼠标 但既不仅限于中小手形 也不仅限于电竞

一、前言&#xff1a;真正针对中小手形设计的电竞鼠标 雷柏第二代VT系列电竞鼠标我们已经体验过很多款了&#xff0c;基本都是针对大中手形设计的外形模具&#xff0c;只有VT3s系列是VT3系列的缩小版&#xff0c;更适合中小手形使用&#xff0c;但也只是对中大手形模具重新优化…

新客户 | TDengine 时序数据库赋能开源鸿蒙物联展区实时监控与展示

在工业物联网快速发展的当下&#xff0c;企业普遍面临着两大挑战&#xff1a;一是设备种类繁多、接入标准不一&#xff0c;导致系统建设容易陷入“数据孤岛”&#xff1b;二是实时监控和多场景联动的需求越来越强烈&#xff0c;但传统数据库在高频写入与多维分析上难以兼顾&…

深入剖析 ConcurrentHashMap:Java 并发编程的基石

目录 【1】Java 7 中 ConcurrentHashMap 的实现原理 1.分段锁&#xff08;Segment&#xff09; 2. 数据结构 3. 操作流程 【2】Java 8 中 ConcurrentHashMap 的改进 1.红黑树的引入 2.CAS 操作 3.数据结构的变化 【3】ConcurrentHashMap 的常用方法及使用示例 1.put(…

【会员专享数据】2020-2022年我国乡镇的逐日地表气压数据(Shp/Excel格式)

之前我们分享过2020—2022年中国0.01分辨率逐日地表气压栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01;该数据是研究者张凌, 胡英屹等发布在国家冰川冻土沙漠科学数据中心平台上的高分辨地表气压数据。很多小伙伴拿到数据后反馈栅格数据不太方便使用&a…

第二阶段WinForm-12:UI控件库

1_验证码与条形码 1.1_条码基础知识 条码&#xff1a;条码是由一组按一定编码规则排列的条、空符号组成&#xff0c;用以表示一定的字符、数字及符号组成的信息 1.2_一维码 &#xff08;1&#xff09;Code 128 Code 128 是一种密度很高的字母数字代码系统&#xff0c;可对其…

别再误会了!Redis 6.0 的多线程,和你想象的完全不一样

技术解析核心误区&#xff1a;Redis 6.0是完全多线程的吗&#xff1f;No. Redis 6.0引入的多线程&#xff0c;只用于网络I/O的读写和数据的解析。而核心的命令执行&#xff08;比如 GET, SET, HGETALL 等&#xff09;依然是单线程的。Redis的架构演进&#xff0c;就像是把一个复…

23种设计模式——抽象工厂模式(Abstract Factory Pattern)详解

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;设计模式 ✨特色专栏&#xff1a;知识分享 &#x…

本地部署开源数据生成器项目实战指南

本地部署开源数据生成器项目实战指南 前言 在当今大数据和人工智能时代&#xff0c;高质量数据集对于模型训练和算法开发至关重要。然而&#xff0c;获取真实且合规的数据集往往面临隐私、成本和法律等多重挑战。合成数据生成技术为此提供了优雅的解决方案&#xff0c;它能够…

2025React面试题集锦

1. React 是什么?它有哪些主要特点? React 是由Facebook开发的开源JavaScript库,用于构建用户界面(UI),尤其适合开发复杂的单页应用(SPA)。 主要特点: 声明式编程:只需描述UI应该是什么样子(如return <div>Hello</div>),React会自动处理DOM更新,无需…

设计模式:迭代器模式(Iterator Pattern)

文章目录一、概念二、实例分析三、示例代码一、概念 迭代器模式 是一种 行为型设计模式&#xff0c;用于在不暴露集合对象内部结构的前提下&#xff0c;顺序访问集合中的元素。 换句话说&#xff1a; 集合类只负责数据存储&#xff1b;迭代器类负责遍历集合&#xff1b;使用者…

Vue 3 学习路线指南

阶段一:基础入门 (1-2周) 1.1 环境准备 # 安装 Node.js (推荐 18+ 版本) # 安装 Vue CLI 或使用 Vite npm create vue@latest my-vue-app cd my-vue-app npm install npm run dev1.2 Vue 3 核心概念 响应式系统:ref(), reactive(), computed() 组合式 API:setup() 函数 模…

使用 `hover:not-[:has(:hover)]` 避免「父元素和子元素同时 hover」时的样式冲突

:hover:not-(:has(:hover)) has() CSS 4 引入的“父选择器”&#xff0c;意思是&#xff1a;匹配那些里面包含某个子元素/状态的元素。 例如&#xff1a;:has(:hover) 表示「自身包含正在被 hover 的子元素」。 :not() 取反伪类&#xff0c;表示不匹配里面的条件。 比如我…

第三十天-DMA串口实验

一、DMA概述二、DMA通道注意&#xff0c;想要往串口中写数据&#xff0c;外部请求信号应该是USARTx_TX&#xff0c;当DR寄存器为空时&#xff0c;产生TX信号&#xff0c;请求DMA。反之&#xff0c;从串口中读数据&#xff0c;外部请求信号应该是USARTx_RX&#xff0c;当DR寄存器…

C/C++ 中的inline(内联函数关键字)详解

在 C/C 编程中&#xff0c;函数调用虽然带来了代码复用和可读性提升&#xff0c;但频繁调用小型函数可能会产生额外的调用开销&#xff08;call overhead&#xff09;&#xff0c;比如栈帧的建立与销毁、参数传递等。 为了减少这种开销&#xff0c;C 引入了 inline&#xff08;…

2025 年高教社杯全国大学生数学建模竞赛A 题 烟幕干扰弹的投放策略完整成品 思路 模型 代码 结果 全网首发高质量!!!

烟幕干扰弹主要通过化学燃烧或爆炸分散形成烟幕或气溶胶云团,在目标前方特定空域形成遮蔽&#xff0c;干扰敌方导弹&#xff0c;具有成本低、效费比高等优点。随着烟幕干扰技术的不断发展&#xff0c;现已有多种投放方式完成烟幕干扰弹的定点精确抛撒,即在抛撒前能精确控制烟幕…

嵌入式第四十五天(51单片机相关)

一.1.CPU、MPU、MCU、GPU&#xff1a; CPU&#xff08;中央处理器&#xff09;&#xff1a;计算机的核心部件&#xff0c;负责执行指令和处理数据。 MPU&#xff08;微处理器&#xff09;&#xff1a;通常指更通用的处理器&#xff0c;强调计算能力。 MCU&#xff08;微控制器&…

今天面了一个Java后端工程师,真的让我猛抬头

今天面了一个Java后端工程师,真的让我猛抬头啊. 现在面试不像传统的八股文面试,我更多问的都是项目场景相关的问题,但是都能回答的不错.这一点我还是很惊讶的。 不仅如此,她的技术也很扎实,对Java核心机制&#xff08;JVM、并发、集合等&#xff09;理解深入&#xff0c;回答…

拦截器和过滤器(理论+实操)

拦截器和过滤器 本文旨在夯实基础以及实战加深理解,目的是更深的理解以便掌握,希望能跟着动手敲一遍,绝对受益匪浅 在本文,我会先给出两者的区别(理论知识),随后是两者各自的实操实现 文章目录拦截器和过滤器什么是过滤器和拦截器?1.过滤器2.拦截器执行整体流程拦截器和过滤器…