@toc
本文问题
- 在MySQL中,时间间隔用什么格式来表示?
- 时间间隔的单位有哪些?分别表示什么意义?
- 如何获取两个日期/时间之间的间隔?
- 更改日期和时间有哪几种方法?
- 哪些函数可以用来更改日期?
- 哪些函数可以用来更改时间?
- 哪些函数可以用来更改日期和时间?
时间间隔
interval_expr
表达式用来代表时间间隔,具体语法如下:INTERVAL expr unit
expr
表示数量 unit
表示单位
时间间隔单位及对应的数值格式
说明 | unit 值 |
expr 格式 |
---|---|---|
微秒 | MICROSECOND | MICROSECONDS |
秒 | SECOND | SECONDS |
分 | MINUTE | MINUTES |
小时 | HOUR | HOURS |
天 | DAY | DAYS |
周 | WEEK | WEEKS |
月 | MONTH | MONTHS |
季度 | QUARTER | QUARTERS |
年 | YEAR | YEARS |
秒+微秒 | SECOND_MICROSECOND | 'SECONDS.MICROSECONDS' |
分+微秒 | MINUTE_MICROSECOND | 'MINUTES:SECONDS.MICROSECONDS' |
分+秒 | MINUTE_SECOND | 'MINUTES:SECONDS' |
小时+微秒 | HOUR_MICROSECOND | 'HOURS:MINUTES:SECONDS.MICROSECONDS' |
小时+秒 | HOUR_SECOND | 'HOURS:MINUTES:SECONDS' |
小时+分 | HOUR_MINUTE | 'HOURS:MINUTES' |
天+微秒 | DAY_MICROSECOND | 'DAYS HOURS:MINUTES:SECONDS.MICROSECONDS' |
天+秒 | DAY_SECOND | 'DAYS HOURS:MINUTES:SECONDS' |
天+分 | DAY_MINUTE | 'DAYS HOURS:MINUTES' |
天+时间 | DAY_HOUR | 'DAYS HOURS' |
年+月 | YEAR_MONTH | 'YEARS-MONTHS' |
获取时间间隔
PERIOD_DIFF(p1,p2)
月份间隔p1,p2
格式为YYMM
或YYYYMM
结果为p1-p2
DATEDIFF(expr1,expr2)
日期间隔p1,p2
格式为日期或日期时间,但是只使用其中的日期部分,时间部分会被忽略。
结果为expr1-expr2
的天数值TIMEDIFF(expr1,expr2)
时间间隔expr1,expr2
格式为时间或日期时间,两个格式必须相同。
结果为expr1-expr2
的时间值,结果值不能超过TIME
格式的范围TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
日期时间间隔datetime_expr1,datetime_expr2
格式为日期或日期时间,
# PERIOD_DIFF
mysql> select period_diff('202004','202009');
+--------------------------------+
| period_diff('202004','202009') |
+--------------------------------+
| -5 |
+--------------------------------+
1 row in set (0.00 sec)
# DATEDIFF
mysql> select datediff(20200119,20200222);
+-----------------------------+
| datediff(20200119,20200222) |
+-----------------------------+
| -34 |
+-----------------------------+
1 row in set (0.00 sec)
# TIMEDIFF
mysql> select timediff('20200111120000','20200211011200');
+---------------------------------------------+
| timediff('20200111120000','20200211011200') |
+---------------------------------------------+
| -733:12:00 |
+---------------------------------------------+
1 row in set (0.00 sec)
mysql> select timediff('20200111120000','20200311011200');
+---------------------------------------------+
| timediff('20200111120000','20200311011200') |
+---------------------------------------------+
| -838:59:59 |
+---------------------------------------------+
1 row in set, 1 warning (0.00 sec)
# TIMESTAMPDIFF
mysql> select timestampdiff(day,20200119,20200222121122);
+--------------------------------------------+
| timestampdiff(day,20200119,20200222121122) |
+--------------------------------------------+
| 34 |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql> select timestampdiff(second,20200119,20200222121122);
+-----------------------------------------------+
| timestampdiff(second,20200119,20200222121122) |
+-----------------------------------------------+
| 2981482 |
+-----------------------------------------------+
1 row in set (0.00 sec)
更改时间
使用+
/-
INTERVAL
更改时间
不能用时间间隔减去时间
mysql> SELECT '2018-12-31 23:59:59' + INTERVAL 1 SECOND;
-> '2019-01-01 00:00:00'
mysql> SELECT INTERVAL 1 DAY + '2018-12-31';
-> '2019-01-01'
mysql> SELECT '2025-01-01' - INTERVAL 1 SECOND;
-> '2024-12-31 23:59:59'
使用函数更改时间
只更改日期
ADDDATE(date,INTERVAL expr unit)
=DATE_ADD(date,INTERVAL expr unit)
/SUBDATE(date,INTERVAL expr unit)
=DATE_SUB(date,INTERVAL expr unit)
增加/减少INTERVAL expr unit
指定的时间间隔ADDDATE(expr,days)
/SUBDATE(expr,days)
增加/减少days
天数PERIOD_ADD(P,N)
增加月份P
格式要求为YYYYMM
/YYMM
mysql> select adddate('2020-01-02',23),date_add('2020-01-02',interval 23 day); +--------------------------+----------------------------------------+ | adddate('2020-01-02',23) | date_add('2020-01-02',interval 23 day) | +--------------------------+----------------------------------------+ | 2020-01-25 | 2020-01-25 | +--------------------------+----------------------------------------+ 1 row in set (0.00 sec) mysql> select adddate('2020-01-02',interval 10 month),period_add('20200102',10); +-----------------------------------------+---------------------------+ | adddate('2020-01-02',interval 10 month) | period_add('20200102',10) | +-----------------------------------------+---------------------------+ | 2020-11-02 | 20200112 | +-----------------------------------------+---------------------------+ 1 row in set (0.00 sec)
只更改时间
ADDTIME(expr1,expr2)
/SUBTIME(expr1,expr2)
增加/减少时间mysql> SELECT ADDTIME('2007-12-31 23:59:59', '1 1:1:1'),ADDTIME('23:59:59', '1 1:1:1.999999'); +-------------------------------------------+---------------------------------------+ | ADDTIME('2007-12-31 23:59:59', '1 1:1:1') | ADDTIME('23:59:59', '1 1:1:1.999999') | +-------------------------------------------+---------------------------------------+ | 2008-01-02 01:01:00 | 49:01:00.999999 | +-------------------------------------------+---------------------------------------+ 1 row in set (0.00 sec)
增加日期时间间隔
TIMESTAMP(expr), TIMESTAMP(expr1,expr2)
TIMESTAMP(expr)
将expr
转换为DATETIME
格式TIMESTAMP(expr1,expr2)
expr1
格式为日期或日期时间,expr2
格式为时间TIMESTAMPADD(unit,interval,datetime_expr)
unit
:MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR.
mysql> select timestamp('20200102'),timestamp('20200102','12:00:01'),timestamp('2020-01-02 00:00:01','12:00:01'); +-----------------------+----------------------------------+---------------------------------------------+ | timestamp('20200102') | timestamp('20200102','12:00:01') | timestamp('2020-01-02 00:00:01','12:00:01') | +-----------------------+----------------------------------+---------------------------------------------+ | 2020-01-02 00:00:00 | 2020-01-02 12:00:01 | 2020-01-02 12:00:02 | +-----------------------+----------------------------------+---------------------------------------------+ 1 row in set (0.00 sec)
mysql> select timestampadd(day,12,'20200102'),timestampadd(minute,12,'20200102');
+---------------------------------+------------------------------------+
| timestampadd(day,12,'20200102') | timestampadd(minute,12,'20200102') |
+---------------------------------+------------------------------------+
| 2020-01-14 | 2020-01-02 00:12:00 |
+---------------------------------+------------------------------------+
1 row in set (0.00 sec)
### 更改时区
`CONVERT_TZ(dt,from_tz,to_tz)`
将`dt`从`from_tz`更新为`to_tz`时区的`DATETIME`值
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
-> '2004-01-01 13:00:00'
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');
-> '2004-01-01 22:00:00'
# 问题答案
1. 在MySQL中,时间间隔用什么格式来表示?
`INTERVAL expr unit` `expr`表示数值 `unit`表示`expr`的单位
2. 时间间隔的单位有哪些?分别表示什么意义?
单一单位:`microsecond,second,minute,hour,day,week,month,quarter,year`
多种单位:名称格式为:`时间较长的单位`_`时间较短的单位`
时间相关间隔可以从小时到微秒。
`second_microsecond,minute_microsecond,minute_second,hour_microsecond,hour_second,hour_minute,day_microsecond,day_second,day_minute,day_hour`
日期相关间隔只有年月`year_month`
3. 如何获取两个日期/时间之间的间隔?
`timediff(),datediff(),timestampdiff(),PERIOD_DIFF()` 结果值都是前一个时间减去后一个时间。
4. 更改日期和时间有哪几种方法?
直接使用`+/-`符号加上或者减去时间间隔,或者使用函数进行更改
3. 哪些函数可以用来更改日期?
* `adddate,subdate,date_add,date_sub`
区别:`adddate`和`subdate`可以直接给一个数字表示增加或减少天数。也可以使用时间间隔来指定具体的单位
`date_add`和`date_sub`必须使用时间间隔指定具体单位
* `adddate(date,days)`/`adddate(date,INTERVAL expr unit)`/`date_add(date,INTERVAL expr unit)`
* `period_add(P,M)` 增加月份
4. 哪些函数可以用来更改时间?
`addtime,subtime`
5. 哪些函数可以用来更改日期和时间?
`timestamp(expr1,expr2),timestampadd(unit,interval,datetime_expr)`