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)