当前位置: 首页 > news >正文

带您了解TiDB MySQL数据库中关于日期、时间的坑

带您了解TiDB & MySQL数据库中关于日期、时间的坑

  • 时间的基础知识
    • 什么是时间
    • 计算时间的几种方法
      • 世界时(UT)
      • 协调世界时(UTC)
      • 国际原子时(TAI)
    • 时区的概念
      • 中国所在的时区
  • 操作系统的时区
    • date
    • timedatectl
  • 数据库中的时区
    • TiDB数据库中的时区
      • 查看时区参数
      • 与时间相关的函数
      • 与时间相关的数据类型
      • 与日期相关的函数
      • 如何计算闰年
    • MySQL数据库中的时区
      • 日期相关的函数
      • MySQL数据库中的定时器
  • 总结

时间的基础知识

什么是时间

时间是人们根据自然现象而进行的一种抽象概念。人类通过观察日月星辰、季节交替、动植物生长等自然现象,逐渐认识到时间的存在,并进行了一系列的时间计量。

计算时间的几种方法

世界时(UT)

世界时(Universal Time,简称UT)是以地球自转周期作为基础的时间计量标准,UT可以根据不同的定义方式分为UT0、UT1、UT2、UT1R等不同的形式。UT的定义是基于天文观测数据,主要通过观测地球自转的角速度来确定时间单位。UT是地球物理学中使用最广泛的时间系统之一,但它受到地球自转速率的不断变化的影响,因此不够稳定和准确。

为了弥补UT的不足,国际标准化组织(ISO)于1970年提出了协调世界时(UTC)。

协调世界时(UTC)

协调世界时(Coordinated Universal Time,简称UTC),又称世界统一时间,世界标准时间,是目前国际上通用的时间标准,它是以原子钟为基础,通过对全球范围内的原子钟信号进行加权平均而得出的一种时间标准。

协调世界时采用24小时制,一天被划分为24个小时,每小时包括60分钟,每分钟包括60秒。起点是1970年1月1日0时0分0秒,与Unix时间戳相同。

协调世界时以地球自转为基础,以本初子午线上的标准子午线时为基准,使地球各地的时间保持一致。UTC引入了闰秒来纠正由于地球自转速率的微小变化所导致的时间偏差。

国际原子时(TAI)

国际原子时(International Atomic Time,简称TAI)是一个标准的原子时计量系统,以铯原子的振荡频率为基础,是世界上精度最高的时间计量方式之一。TAI通过一个网络由多个原子钟测量得出,并被国际计量组织(BIPM)所管理。

国际原子时与世界时(UT)之间存在微小的偏差,这是由于地球自转速度的变化导致的。因此,国际地球自转服务(IERS)会不定期地宣布添加或减少闰秒,以保持TAI和UT之间的同步。

时区的概念

时区是按照一定的经度范围将地球划分成若干个区域,使得同一个时区内的时间是相同的,以方便人们进行时间交流和统一管理。世界上总共分为24个主要时区,每个主要时区相差15度经度。

通常,时区以协调世界时(UTC)的正负偏移量来表示,偏移量为0的时区被称为“格林威治标准时间”(GMT),也就是世界标准时间。

全球24个标准时区及其相应的偏差(以协调世界时(UTC)为基准):

  • UTC-12: 国际日期变更线以西12小时
  • UTC-11: 协调世界时减去11小时
  • UTC-10: 协调世界时减去10小时
  • UTC-9: 协调世界时减去9小时
  • UTC-8: 协调世界时减去8小时
  • UTC-7: 协调世界时减去7小时
  • UTC-6: 协调世界时减去6小时
  • UTC-5: 协调世界时减去5小时
  • UTC-4: 协调世界时减去4小时
  • UTC-3: 协调世界时减去3小时
  • UTC-2: 协调世界时减去2小时
  • UTC-1: 协调世界时减去1小时
  • UTC: 协调世界时
  • UTC+1: 协调世界时加上1小时
  • UTC+2: 协调世界时加上2小时
  • UTC+3: 协调世界时加上3小时
  • UTC+4: 协调世界时加上4小时
  • UTC+5: 协调世界时加上5小时
  • UTC+6: 协调世界时加上6小时
  • UTC+7: 协调世界时加上7小时
  • UTC+8: 协调世界时加上8小时
  • UTC+9: 协调世界时加上9小时
  • UTC+10: 协调世界时加上10小时
  • UTC+11: 协调世界时加上11小时
  • UTC+12: 协调世界时加上12小时

中国所在的时区

中国所在的时区是指中国范围内划分的标准时区,中国的大致经度范围是73°33′E至135°05′E,本应跨越5个时区,但为了统一管理、保证全国统一时间,中国只采用了一个时区,即东八区(UTC+8)。中国除了采用UTC+8表示时区,还可以使用中国标准时间(China Standard Time,CST)来表示。

操作系统的时区

在Ubuntu 20.04系统中,有几个命令是和时间、时区有关的。

date

可以通过date命令来查看时间,在输出结果中同时会显示当前时间是按什么时间计时的。

wux_labs@wux-labs-vm:~$ date
Wed Feb 22 06:39:29 UTC 2023

image-20230222143718419

从输出结果可以看到,当前是UTC时间,2023-02-22。

timedatectl

还可以使用timedatectl命令查看时间的详细信息。

wux_labs@wux-labs-vm:~$ timedatectlLocal time: Wed 2023-02-22 06:39:35 UTCUniversal time: Wed 2023-02-22 06:39:35 UTCRTC time: Wed 2023-02-22 06:39:35    Time zone: Etc/UTC (UTC, +0000)       
System clock synchronized: yes                        NTP service: active                     RTC in local TZ: no

image-20230222143740512

从结果中可以看到当前时间的详细信息,以及时区信息:

Time zone: Etc/UTC (UTC, +0000)  

使用timedatectl list-timezones命令可以列出所有可使用的时区。

使用timedatectl set-timezone命令可以修改系统的时区。

以下命令将系统时区修改为Asia/Shanghai

wux_labs@wux-labs-vm:~$ sudo timedatectl set-timezone Asia/Shanghai

修改完成后再次查看一下时间信息:

wux_labs@wux-labs-vm:~$ date
Wed Feb 22 14:39:48 CST 2023
wux_labs@wux-labs-vm:~$ timedatectlLocal time: Wed 2023-02-22 14:39:52 CSTUniversal time: Wed 2023-02-22 06:39:52 UTCRTC time: Wed 2023-02-22 06:39:52    Time zone: Asia/Shanghai (CST, +0800) 
System clock synchronized: yes                        NTP service: active                     RTC in local TZ: no

image-20230222144426244

数据库中的时区

TiDB数据库中的时区

在TiDB数据库中,通过参数time_zone可以设置数据库的时区。TiDB中的参数的作用域分为Global级别和Session级别,每个级别都可以设置time_zone参数,TiDB在取值的时候优先取Session级别的,Session级别没设置再取Global级别的,具体的优先级为:

Session > Global > 操作系统 > UTC

查看时区参数

在TiDB中,可以通过以下语句来查看当前集群中的参数。

mysql> select @@global.time_zone,@@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

image-20230222150042438

在当前集群中time_zone都未设置,所以采用的是操作系统的时区。

与时间相关的函数

在TiDB中,有一些与时间有关的函数,其函数返回值会受时区的影响。

  • now()函数用于获取当前时间,包括日期和时间
  • curtime()函数用于获取当前时间,仅包含时间
mysql> select now(),curtime();
+---------------------+-----------+
| now()               | curtime() |
+---------------------+-----------+
| 2023-02-22 07:17:45 | 07:17:45  |
+---------------------+-----------+
1 row in set (0.00 sec)

由于TiDB数据库集群在启动的时候,操作系统采用的时间是UTC时间,所以当前启动的TiDB数据库集群也采用的UTC时间。

下面修改一下Session级别的参数。

mysql> set session time_zone = '+8:00';
Query OK, 0 rows affected (0.00 sec)

修改完成后,再看看当前时区参数以及函数返回值,都会发生变化。

mysql> select @@global.time_zone,@@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +8:00               |
+--------------------+---------------------+
1 row in set (0.00 sec)mysql> select now(),curtime();
+---------------------+-----------+
| now()               | curtime() |
+---------------------+-----------+
| 2023-02-22 15:18:06 | 15:18:06  |
+---------------------+-----------+
1 row in set (0.00 sec)

image-20230222151952213

与时间相关的数据类型

在TiDB中,有一些数据类型也与时间有关。

  • datetime,日期时间类型,会同时存储日期和时间
  • timestamp,时间戳类型,会同时存储日期和时间
  • time,时间类型,仅会存储时间

下面创建一个表用来看看不同数据类型受时区的影响情况。

mysql> create table temp(f1 datetime, f2 timestamp, f3 time);
Query OK, 0 rows affected (0.14 sec)

插入数据,都取当前时间。

mysql> insert into temp values(now(), now(), curtime());
Query OK, 1 row affected (0.01 sec)

查看时区及时间。

mysql> select @@global.time_zone,@@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)mysql> select * from temp;
+---------------------+---------------------+----------+
| f1                  | f2                  | f3       |
+---------------------+---------------------+----------+
| 2023-02-22 07:27:13 | 2023-02-22 07:27:13 | 07:27:13 |
+---------------------+---------------------+----------+
1 row in set (0.00 sec)

以上结果是采用UTC时间的值,数据是持久化到表中的,固定不变的值。

image-20230222152926293

接下来,切换一下时区,再来看看表中的数据情况。

mysql> set session time_zone = '+8:00';
Query OK, 0 rows affected (0.00 sec)mysql> select @@global.time_zone,@@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +8:00               |
+--------------------+---------------------+
1 row in set (0.00 sec)mysql> select * from temp;
+---------------------+---------------------+----------+
| f1                  | f2                  | f3       |
+---------------------+---------------------+----------+
| 2023-02-22 07:27:13 | 2023-02-22 15:27:13 | 07:27:13 |
+---------------------+---------------------+----------+
1 row in set (0.01 sec)

从结果可以看到,对于已经持久化保存的固定数据:

  • datetime、time两种数据类型的值不受时区影响
  • timestamp数据类型的值会受时区影响,时区不同,查询结果不同

image-20230222153120778

避坑1:

在数据库中,使用Timestamp数据类型,一定要小心,一定要确定好时区,分析影响性。

如果可以,使用datetime类型,而不使用timestamp类型。

与日期相关的函数

在TiDB数据库中,有一些关于日期的函数、计算:

  • curdate(),用来获取当前时间

  • date(),将字符串转换成日期

  • day(),获取日期的天

  • +interval 1 day,日期计算,加1天

  • =,可用于判断两个日期是否相等,相等返回1,不等返回0

  • datediff(),用来计算两个日期之间相差的天数

比如下面的代码用来做日期相关的计算:

mysql> select curdate(), curdate() + interval 5 day, day(curdate()), date('2023-02-22'), curdate() = date('2023-02-22'), curdate() = date('2023-02-23');
+------------+----------------------------+----------------+--------------------+--------------------------------+--------------------------------+
| curdate()  | curdate() + interval 5 day | day(curdate()) | date('2023-02-22') | curdate() = date('2023-02-22') | curdate() = date('2023-02-23') |
+------------+----------------------------+----------------+--------------------+--------------------------------+--------------------------------+
| 2023-02-22 | 2023-02-27                 |             22 | 2023-02-22         |                              1 |                              0 |
+------------+----------------------------+----------------+--------------------+--------------------------------+--------------------------------+
1 row in set (0.00 sec)

image-20230222161304920

注意:

date()函数仅能将有效的日期字符串转换成日期,如果日期不合法将会返回NULL。

在下面的例子中,data将正确的日期进行了转换,错误的日期返回了NULL。

mysql> select date('2023-02-22'),date('20230222'),date('2023-02-29'),date('20230229');
+--------------------+------------------+--------------------+------------------+
| date('2023-02-22') | date('20230222') | date('2023-02-29') | date('20230229') |
+--------------------+------------------+--------------------+------------------+
| 2023-02-22         | 2023-02-22       | NULL               | NULL             |
+--------------------+------------------+--------------------+------------------+
1 row in set, 2 warnings (0.00 sec)

避坑2:

不要以为用date()函数可以成功转换的日期都是正常的日期,有能够成功转换的也是错误日期。

比如,你见过日为00的日期吗?

在下面的案例中,'2023-03-00’是一个错误的日期,但是经过date()函数转换后并不是NULL,而确实是一个日期。但是这个日期,并不等于2023-03-01的前一天。

mysql> select date('2023-03-00'),date('2023-03-01'),date('2023-03-01') - interval 1 day, date('2023-03-00') = date('2023-03-01') - interval 1 day;
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
| date('2023-03-00') | date('2023-03-01') | date('2023-03-01') - interval 1 day | date('2023-03-00') = date('2023-03-01') - interval 1 day |
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
| 2023-03-00         | 2023-03-01         | 2023-02-28                          |                                                        0 |
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
1 row in set (0.00 sec)

image-20230222162331025

这个日期的天是0,并且它不是2023-03-01的前一天,也不是2023-02-28的后一天。

mysql> select day(date('2023-03-00')),day(date('2023-03-01')),date('2023-03-01') - interval 1 day, date('2023-03-00') = date('2023-02-28') + interval 1 day;
+-------------------------+-------------------------+-------------------------------------+----------------------------------------------------------+
| day(date('2023-03-00')) | day(date('2023-03-01')) | date('2023-03-01') - interval 1 day | date('2023-03-00') = date('2023-02-28') + interval 1 day |
+-------------------------+-------------------------+-------------------------------------+----------------------------------------------------------+
|                       0 |                       1 | 2023-02-28                          |                                                        0 |
+-------------------------+-------------------------+-------------------------------------+----------------------------------------------------------+
1 row in set (0.00 sec)

image-20230222162640395

由于它不是一个正常的日期,所以它无法计算日期之间的差值。

mysql> select datediff(date('2023-02-28'),date('1970-01-01')),datediff(date('2023-03-00'),date('1970-01-01')),datediff(date('2023-03-01'),date('1970-01-01'));
+-------------------------------------------------+-------------------------------------------------+-------------------------------------------------+
| datediff(date('2023-02-28'),date('1970-01-01')) | datediff(date('2023-03-00'),date('1970-01-01')) | datediff(date('2023-03-01'),date('1970-01-01')) |
+-------------------------------------------------+-------------------------------------------------+-------------------------------------------------+
|                                           19416 |                                            NULL |                                           19417 |
+-------------------------------------------------+-------------------------------------------------+-------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

image-20230222164004982

如何计算闰年

在TiDB数据库中,可以通过日期的计算函数来计算当年是否是闰年,当2月的最后一天是29则是闰年,28则不是闰年。

mysql> select last_day(date('2023-02-01')), case when day(last_day(date('2023-02-01'))) = 29 then '是闰年' else '不是闰年' end;
+------------------------------+-------------------------------------------------------------------------------------------+
| last_day(date('2023-02-01')) | case when day(last_day(date('2023-02-01'))) = 29 then '是闰年' else '不是闰年' end        |
+------------------------------+-------------------------------------------------------------------------------------------+
| 2023-02-28                   | 不是闰年                                                                                  |
+------------------------------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

image-20230222164815522

mysql> select last_day(date('2024-02-01')), case when day(last_day(date('2024-02-01'))) = 29 then '是闰年' else '不是闰年' end;
+------------------------------+-------------------------------------------------------------------------------------------+
| last_day(date('2024-02-01')) | case when day(last_day(date('2024-02-01'))) = 29 then '是闰年' else '不是闰年' end        |
+------------------------------+-------------------------------------------------------------------------------------------+
| 2024-02-29                   | 是闰年                                                                                    |
+------------------------------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

image-20230222165039166

MySQL数据库中的时区

MySQL数据库中的时区与TiDB数据库中的时区一致,这里就不重复演示了。

还是需要注意Timestamp数据类型的使用。

日期相关的函数

在MySQL中也有与TiDB相同的关于日期的函数,这里也就不重复演示了。

但是有一个不太一样的,就是date(),TiDB中会将date(‘2023-03-00’)成功转换成日期,虽然该日期非法,但不为NULL。而在MySQL中date(‘2023-03-00’)是非法的,返回NULL。

mysql> select date('2023-03-00'),date('2023-03-01'),date('2023-03-01') - interval 1 day, date('2023-03-00') = date('2023-03-01') - interval 1 day;
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
| date('2023-03-00') | date('2023-03-01') | date('2023-03-01') - interval 1 day | date('2023-03-00') = date('2023-03-01') - interval 1 day |
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
| NULL               | 2023-03-01         | 2023-02-28                          |                                                     NULL |
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
1 row in set, 2 warnings (0.00 sec)

image-20230222165528962

MySQL数据库中的定时器

在TiDB数据库中不支持存储过程、自定义函数、触发器、定时器等。

在MySQL数据库中,可以创建定时器。

下面的语句创建一个定时器,每10秒钟往表中插入一条记录,5分钟后结束定时器功能。

mysql> create event insert_event-> on schedule every 10 second-> ends now() + interval 5 minute-> do insert into temp values(now(), now(), curtime());
Query OK, 0 rows affected (0.02 sec)

定时器创建完成后,每隔一段时间查看数据库表的数据,可以看到数据的增长。

image-20230222154922506

总结

好了,以上就是数据库中关于日期、时间的使用,在TiDB中有几个坑、MySQL中也有几个坑,你遇到过吗?使用的时候一定要注意。

最后我们实现了在数据库中判断闰年、定时器等功能。

相关文章:

带您了解TiDB MySQL数据库中关于日期、时间的坑

带您了解TiDB & MySQL数据库中关于日期、时间的坑时间的基础知识什么是时间计算时间的几种方法世界时(UT)协调世界时(UTC)国际原子时(TAI)时区的概念中国所在的时区操作系统的时区datetimedatectl数据库…...

【华为OD机试模拟题】用 C++ 实现 - 求字符串中所有整数的最小和

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

harbor 仓库迁移升级

harbor 仓库迁移升级 harbor仓库安装数据传输仓库切换版本 v1.8.0 v2.3.5 harbor仓库安装 环境准备:安装docker详见:docker 的介绍和部署,并下载docker-compose详见:docker 三剑客compose。 现有支持的安装harbor仓库的方式有两…...

评论功能设计思路~

文章目录 评论功能设计框架1、定义2、目标3、动机4、评论类别**5、评论互动****6、评论区展示结构****6.1 主题式****6.2 平铺式****6.3 盖楼式****7、评论排序机制****8、评论加载形式****9、其他**结语评论功能设计框架 1、定义 评论是指针对于事物进行主观或客观的自我印象…...

算法训练营 day52 动态规划 买卖股票的最佳时机系列1

算法训练营 day52 动态规划 买卖股票的最佳时机系列1 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣(LeetCode) 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票…...

3.基于分割的文本检测算法--DBNet++

文章目录1.概况2.DBNet中的主要方法2.1 网络结构2.2 适应特征图融合模块(Adaptive Scale Fusion Module, ASF)3.ASF模块的源码实现参考资料欢迎访问个人网络日志🌹🌹知行空间🌹🌹 1.概况 2022年02月份论文:Real-Time S…...

IOS打包、SDK接入记录等

IOS打包、SDK接入记录等 Mac上安装HCLR路径 /Applications/Unity/Hub/Editor/2019.4.40f1c1/Unity.app/Contents/il2cpp HCLR 指定4.40是要Unity启动打开的il2cpp,否则HCLR Installer他会报找不到MonoBleedingEdge Mac删除证书 只能点击钥匙串做上角的登录后&…...

【C++】类与对象(引入)

目录 前言 类的引入 类的定义 封装与访问限定符 封装 访问限定符 类的实例化 类的大小 this指针 特性 前言 🎶我们都知道,C语言是面向过程的编程,而C是面向对象的编程,更多体现在编程的关注点上。 🎶就拿洗…...

Redis 高级数据类型

文章目录一、Bitmaps:属性状态统计二、HyperLogLog:基数统计三、GEO:地理位置信息计算提示:以下是本篇文章正文内容,Redis系列学习将会持续更新 一、Bitmaps:属性状态统计 Bitmaps类型: 统计一…...

Java8 新特性-函数式接口

什么是函数式接口 先来看看传统的创建线程是怎么写的 Thread t1 new Thread(new Runnable() {Overridepublic void run() {System.out.println("t1");} }); t1.start();再来看看使用了函数式接口是怎么写的 Thread t2 new Thread(() -> System.out.println(&…...

这套软件测试试卷能打90分,直接入职字节吧

目录 一.填空 二、 判断题(正确的√,错误的╳)共10分,每小题1分 三、数据库部分:(共15分) 四、设计题。本题共 1 小题,满分 20分 一.填空 1、 系…...

GUI可视化应用开发及Python实现

0 建议学时 4学时,在机房进行 1 开发环境安装及配置 1.1 编程环境 安装PyCharm-community-2019.3.3 安装PyQt5 pip install PyQt5-tools -i https://pypi.douban.com/simple pip3 install PyQt5designer -i https://pypi.douban.com/simple1.2 环境配置 选择“…...

【论文简述】GMFlow: Learning Optical Flow via Global Matching(CVPR 2022)

一、论文简述 1. 第一作者:Haofei Xu 2. 发表年份:2022 3. 发表期刊:CVPR oral 4. 关键词:光流、代价体、Transformers、全局匹配、注意力机制 5. 探索动机:过去几年中具有代表性的光流学习框架的核心估计方式没有…...

【Spark分布式内存计算框架——离线综合实战】5. 业务报表分析

第三章 业务报表分析 一般的系统需要使用报表来展示公司的运营情况、 数据情况等,本章节对数据进行一些常见报表的开发,广告数据业务报表数据流向图如下所示: 具体报表的需求如下: 相关报表开发说明如下: 第一、数据…...

力扣-删除重复的电子邮箱

大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:196. 删除重复的电子邮箱二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其…...

git基础

git-note Github Manual | GitHub Cheat Sheet | Visual Git Cheat Sheet 安装配置工具分支创建仓库.gitignore文件同步更改进行更改重做提交术语表 安装 desktop.github.com | git-scm.com 配置工具 对所有本地仓库的用户信息进行配置 对你的commit操作设置关联的用户名…...

postgres 源码解析50 LWLock轻量锁--1

简介 postgres LWLock(轻量级锁)是由SpinLock实现,主要提供对共享存储器的数据结构的互斥访问。LWLock有两种锁模式,一种为排他模式,另一种是共享模式,如果想要读取共享内存中的内容,需要在读取…...

JVM优化常用命令

jps列出正在运行的虚拟机进程jpstop列出线程CPU或内存占用top top -Hp pid //列出pid全部线程jstat监视虚拟机运行状态信息jstat -gc pid 5000 //每隔5s打印gc情况jmapjmap -heap pid //输出jvm内存情况 jmap -histo:live pid | more //查看堆内存中的对象数量和大小 jma…...

按键中断实验

gpio.c#include"gpio.h"//给gpio使能和设置为输入模式void hal_gpio_init(){//使能GPIOF控制器RCC->MP_AHB4ENSETR|(0x1<<5);//通过GPIOF_将pf9/pf7/pf8设置为输入模式 GPIOF->MODER&(~(0x3<<18));GPIOF->MODER&(~(0x3<<14));GPI…...

kubernetes入门介绍,从0到1搭建并使用

Kubernetes是一个容器编排系统&#xff0c;用于自动化应用程序部署、扩展和管理。本指南将介绍Kubernetes的基础知识&#xff0c;包括基本概念、安装部署和基础用法。 基础介绍 Kubernetes是Google开发的开源项目&#xff0c;是一个容器编排系统&#xff0c;可以自动化部署、…...

基于S7-200 PLC与组态王的大棚控制系统:产品原理图与IO分配详解

基于S7-200 PLC和组态王温室大棚控制 我们主要的后发送的产品有&#xff0c;带解释的梯形图接线图原理图图纸&#xff0c;io分配&#xff0c;组态画面 菜农张叔上周还给我打电话吐槽&#xff1a;“小王啊&#xff0c;上周那场降温加突然转晴&#xff0c;我三点爬起来盖半层棉被…...

【JavaWeb开发】从零构建前后端交互实战指南

1. JavaWeb前后端交互基础入门 第一次接触JavaWeb开发时&#xff0c;最让我困惑的就是前后端如何传递数据。记得刚开始做项目时&#xff0c;我傻乎乎地用字符串拼接HTML代码返回给前端&#xff0c;结果遇到中文乱码问题折腾了一整天。后来才发现&#xff0c;现代JavaWeb开发早已…...

Dual-Tree Agent RAG:可控、可解释、可验证

从文本检索到方法推理的跃迁 传统RAG系统将文档切分为平面文本块&#xff0c;通过向量相似度检索来增强大模型生成。这种模式在简单事实问答中表现良好&#xff0c;却难以应对需要全局结构理解、跨章节整合和方法论复用的复杂创新任务。现有改进方案如RAPTOR&#xff08;层次摘…...

SAP资产主数据批量修改避坑大全:GGB1替代+AR31工作清单配置详解(含日期字段特殊处理)

SAP资产主数据批量修改实战指南&#xff1a;从GGB1替代到AR31工作清单全流程解析 当财务团队需要对上千条资产记录进行成本中心迁移时&#xff0c;手工修改不仅效率低下&#xff0c;还容易产生数据不一致。SAP系统提供的GGB1替代规则与AR31工作清单组合方案&#xff0c;正是解决…...

水下机器人导航的‘感官进化’:从纯视觉VIO到声光惯压融合的SVIn2系统拆解

水下机器人导航的‘感官进化’&#xff1a;从纯视觉VIO到声光惯压融合的SVIn2系统拆解 当一台水下机器人潜入浑浊的湖泊执行管道巡检任务时&#xff0c;它的视觉传感器突然失效——悬浮颗粒使画面变成乳白色噪点&#xff0c;而水流扰动让惯性测量单元(IMU)数据充满噪声。这正是…...

AI虚拟员工平台完整搭建教程:从源码获取到正式上线,全流程记录

温馨提示&#xff1a;文末有资源获取方式最近AI赛道又火了一个新方向&#xff0c;很多人都在讨论&#xff0c;但真正能用起来的没几个。技术门槛摆在那&#xff0c;普通用户想上手确实不容易。今天这篇教程&#xff0c;我把从源码部署到正式上线的完整过程整理出来&#xff0c;…...

3KW无线充电系统设计:开环控制与闭环控制的MATLAB Simulink仿真模型,采用双边L...

3KW无线充电系统设计&#xff08;MATLAB simulink仿真模型&#xff09; 控制方式&#xff1a;开环控制闭环控制 拓扑结构&#xff1a;双边LCC拓扑结构 输入电压&#xff1a;750V 输出电压&#xff1a;400V 传输功率&#xff1a;3KW 最近在折腾一个3KW无线充电系统的仿真项目&am…...

突破运营商限制:中兴光猫配置文件解密工具完全指南

突破运营商限制&#xff1a;中兴光猫配置文件解密工具完全指南 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 一、用户痛点解析&#xff1a;你是否正遭遇这些网络管理困境…...

【Hot 100 刷题计划】 LeetCode 138. 随机链表的复制 | C++ 链表深拷贝题解

LeetCode 138. 随机链表的复制 | C 哈希表 DFS 深拷贝题解 &#x1f4cc; 题目描述 题目级别&#xff1a;中等 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 请你构造这个链表的深拷…...

拯救大模型“幻觉”?Python RAG九大架构全解析

别让你的AI助手&#xff0c;从“得力员工”变成“职场骗子” 你是否也曾被大模型的“一本正经胡说八道”气到无语&#xff1f; 你精心部署的客服机器人&#xff0c;自信地告诉客户&#xff1a;“我们的退货政策是90天&#xff01;”——而实际上&#xff0c;公司的规定是30天…...