mysql 时间加法源码理解

本文介绍了MySQL中时间加法操作的数据类型处理,包括DATETIME、DATE、TIME和STRING类型。详细解析了INTERVAL的不同单位以及它们对结果类型的影响。例如,当DATE类型与INTERVAL小时、分钟、秒、微秒结合时,结果将转换为DATETIME。通过源码分析,揭示了精度计算规则,并给出了多个示例展示不同情况下的加法结果类型和精度变化。

mysql 时间的加法操作中数据类型主要包含:DATETIME、TIMESTAMP、TIME、DATE、STRING。其INTERVAL 的单位包含20种(day、hour、minute、second、microsecond、week、month、quarter、year、hour_second、hour_minute、hour_microsecond、minute_second、minute_microsecond、day_second、day_hour、day_minute、day_microsecond、second_microsecond、year_month)。

mysql表现:
1、如果第一个参数是DATETIME类型, 那么结果为DATETIME 类型。
2、如果第一个参数是DATE类型, 并且 interval 类型用: hour、minute、seconds、microsecond。那么结果为DATETIME 类型,否则结果为DATE类型。例1、例2所示。
3、如果第一个参数是TIME类型,那么返回结果为TIME 类型。例3所示。
4、否则,结果为string类型.(因为不能确定这个string是否包含DATE,TIME,还是datetime参数。

通过读mysql源码理解返回类型:
1、当interval为 microsecond 或者 day_microsecond 或者 hour_mocrosecond 或者 minute_microsecond 或者 second_microsecond 时,精度为6.
或者当interval为 second时,并且参数的精度大于0,则结果精度为参数精度和6取较小值。
2、在做加法时,datetime和timestamp类型,其处理方式相同
3、当结果为时间TIME类型时,加上interval值后,其小时可以大于24,可达到小时占用位数的最大值。

例1:
mysql> select date_add(‘2008-12-29’, INTERVAL 2 week);
Field 1: date_add(‘2008-12-29’, INTERVAL 2 week)
Catalog: def
Database:
Table:
Org_table: “
Type: STRING
Collation: utf8mb4_general_ci (45)
Length: 116
Max_length: 10
Decimals: 31
Flags:

+—————————————–+
| date_add(‘2008-12-29’, INTERVAL 2 week) |
+—————————————–+
| 2009-01-12 |
+—————————————–+
1 row in set (0.00 sec)

mysql> select date_add(DATE ‘2008-12-29’, INTERVAL 2 week);
Field 1: date_add(DATE ‘2008-12-29’, INTERVAL 2 week)
Catalog: def
Database:
Table:
Org_table: “
Type: DATE
Collation: binary (63)
Length: 10
Max_length: 10
Decimals: 0
Flags: BINARY

+———————————————-+
| date_add(DATE ‘2008-12-29’, INTERVAL 2 week) |
+———————————————-+
| 2009-01-12 |
+———————————————-+
1 row in set (0.01 sec)

例2:
mysql> select date_add(‘2008-12-29’, INTERVAL 20 microsecond);
Field 1: date_add(‘2008-12-29’, INTERVAL 20 microsecond)
Catalog: def
Database:
Table:
Org_table: “
Type: STRING
Collation: utf8mb4_general_ci (45)
Length: 116
Max_length: 26
Decimals: 31
Flags:

+————————————————-+
| date_add(‘2008-12-29’, INTERVAL 20 microsecond) |
+————————————————-+
| 2008-12-29 00:00:00.000020 |
+————————————————-+
1 row in set (0.01 sec)

mysql> select date_add(DATE ‘2008-12-29’, INTERVAL 20 microsecond);
Field 1: date_add(DATE ‘2008-12-29’, INTERVAL 20 microsecond)
Catalog: def
Database:
Table:
Org_table: “
Type: DATETIME
Collation: binary (63)
Length: 17
Max_length: 26
Decimals: 6
Flags: BINARY

+——————————————————+
| date_add(DATE ‘2008-12-29’, INTERVAL 20 microsecond) |
+——————————————————+
| 2008-12-29 00:00:00.000020 |
+——————————————————+
1 row in set (0.01 sec)

例3:
mysql> select date_add(TIME ‘16:25:46.635’, INTERVAL 2 hour);
Field 1: date_add(TIME ‘16:25:46.635’, INTERVAL 2 hour)
Catalog: def
Database:
Table:
Org_table: “
Type: TIME
Collation: binary (63)
Length: 14
Max_length: 12
Decimals: 3
Flags: BINARY

+————————————————+
| date_add(TIME ‘16:25:46.635’, INTERVAL 2 hour) |
+————————————————+
| 18:25:46.635 |
+————————————————+
1 row in set (0.00 sec)

mysql> select date_add(‘16:25:46.635’, INTERVAL 2 hour);
Field 1: date_add(‘16:25:46.635’, INTERVAL 2 hour)
Catalog: def
Database:
Table:
Org_table: “
Type: STRING
Collation: utf8mb4_general_ci (45)
Length: 116
Max_length: 0
Decimals: 31
Flags:

+——————————————-+
| date_add(‘16:25:46.635’, INTERVAL 2 hour) |
+——————————————-+
| NULL |
+——————————————-+
1 row in set, 1 warning (0.01 sec)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值