1.获取服务器当前时间
SELECT
NOW() time01, # 获取当前时间
SYSDATE() time02, # 获取当前时间
SLEEP(3), # 等待3秒
NOW() time03, # NOW获取的是语句开始执行时的时间
SYSDATE() time04 # SYSDATE获取的是函数被执行时的时间
;
/*
+---------------------+---------------------+----------+---------------------+---------------------+
| time01 | time02 | SLEEP(3) | time03 | time04 |
+---------------------+---------------------+----------+---------------------+---------------------+
| 2018-08-25 14:04:57 | 2018-08-25 14:04:57 | 0 | 2018-08-25 14:04:57 | 2018-08-25 14:05:00 |
+---------------------+---------------------+----------+---------------------+---------------------+
1 row in set (3.001 sec)
*/
2.时间转换函数
SELECT
DATE_FORMAT(NOW(), '%Y-%m-%d') time01, # 按参数2格式化日期,返回格式化后的文本
DATE_FORMAT(NOW(), '今天是:%Y-%m-%d,这是利用%%Y-%%m-%%d格式化所得') time02, # 允许加入其他字符,%是转义字符
STR_TO_DATE('2018-08-25', '%Y-%m-%d') time03 # DATE_FORMAT的反函数
;
/*
+------------+-------------------------------------------+------------+
| time01 | time02 | time03 |
+------------+-------------------------------------------+------------+
| 2018-08-25 | 今天是:2018-08-25,这是利用%Y-%m-%d格式化所得 | 2018-08-25 |
+------------+-------------------------------------------+------------+
1 row in set (0.001 sec)
*/
date_from可选用的格式:
格式 | 描述 |
---|---|
%a | 缩写星期名 |
%b | 缩写月名 |
%c | 月,数值 |
%D | 带有英文前缀的月中的天 |
%d | 月的天,数值(00-31) |
%e | 月的天,数值(0-31) |
%f | 微秒 |
%H | 小时 (00-23) |
%h | 小时 (01-12) |
%I | 小时 (01-12) |
%i | 分钟,数值(00-59) |
%j | 年的天 (001-366) |
%k | 小时 (0-23) |
%l | 小时 (1-12) |
%M | 月名 |
%m | 月,数值(00-12) |
%p | AM 或 PM |
%r | 时间,12-小时(hh:mm:ss AM 或 PM) |
%S | 秒(00-59) |
%s | 秒(00-59) |
%T | 时间, 24-小时 (hh:mm:ss) |
%U | 周 (00-53) 星期日是一周的第一天 |
%u | 周 (00-53) 星期一是一周的第一天 |
%V | 周 (01-53) 星期日是一周的第一天,与 %X 使用 |
%v | 周 (01-53) 星期一是一周的第一天,与 %x 使用 |
%W | 星期名 |
%w | 周的天 (0=星期日, 6=星期六) |
%X | 年,其中的星期日是周的第一天,4 位,与 %V 使用 |
%x | 年,其中的星期一是周的第一天,4 位,与 %v 使用 |
%Y | 年,4 位 |
%y | 年,2 位 |
3.时间计算函数
# 单位介绍
SELECT
DATE_ADD('2018-08-25 14:00:00', INTERVAL 1 YEAR) time01, # 年
DATE_ADD('2018-08-25 14:00:00', INTERVAL 1 QUARTER) time02, # 季度
DATE_ADD('2018-08-25 14:00:00', INTERVAL 1 MONTH) time03, # 月
DATE_ADD('2018-08-25 14:00:00', INTERVAL 1 WEEK) time04, # 星期
DATE_ADD('2018-08-25 14:00:00', INTERVAL 1 DAY) time05; # 天
+---------------------+---------------------+---------------------+---------------------+---------------------+
| time01 | time02 | time03 | time04 | time05 |
+---------------------+---------------------+---------------------+---------------------+---------------------+
| 2019-08-25 14:00:00 | 2018-11-25 14:00:00 | 2018-09-25 14:00:00 | 2018-09-01 14:00:00 | 2018-08-26 14:00:00 |
+---------------------+---------------------+---------------------+---------------------+---------------------+
1 row in set (0.002 sec)
SELECT
DATE_ADD('2018-08-25 14:00:00', INTERVAL 1 HOUR) time06, # 小时
DATE_ADD('2018-08-25 14:00:00', INTERVAL 1 MINUTE) time07, # 分钟
DATE_ADD('2018-08-25 14:00:00', INTERVAL 1 SECOND) time08, # 秒
DATE_ADD('2018-08-25 14:00:00', INTERVAL 1 MICROSECOND) time09; # 微秒
/*
+---------------------+---------------------+---------------------+----------------------------+
| time06 | time07 | time08 | time09 |
+---------------------+---------------------+---------------------+----------------------------+
| 2018-08-25 15:00:00 | 2018-08-25 14:01:00 | 2018-08-25 14:00:01 | 2018-08-25 14:00:00.000001 |
+---------------------+---------------------+---------------------+----------------------------+
1 row in set (0.001 sec)
*/
# 函数介绍
SELECT
DATE_ADD('2018-08-25 14:00:00', INTERVAL 1 YEAR) time01, # 增加一个时间
ADDDATE('2018-08-25 14:00:00', INTERVAL 1 YEAR) time02, # 等价于DATE_ADD
ADDDATE('2018-08-25 14:00:00', 1) time03, # 默认单位是天
ADDDATE('2018-08-25 14:00:00', INTERVAL '1 02:03:04' DAY_SECOND) time04, # 从DAY级到SECOND级,各自相加
ADDTIME('2018-08-25 14:00:00', 1) time05, # 增加秒数
DATE_SUB('2018-08-25 14:00:00', INTERVAL 1 YEAR) time06 # 减去一个时间,常用DATE_ADD并传递负数代替,对应的函数还有SUBDATE,SUBTIME
;
/*
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
| time01 | time02 | time03 | time04 | time05 | time06 |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
| 2019-08-25 14:00:00 | 2019-08-25 14:00:00 | 2018-08-26 14:00:00 | 2018-08-26 16:03:04 | 2018-08-25 14:00:01 | 2017-08-25 14:00:00 |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
1 row in set (0.001 sec)
*/
SELECT
DATEDIFF('2018-08-25 14:00:00', '2018-08-24 01:00:00') time01, # 时间1-时间2,天后面部分舍弃(不是四舍五入)
TIMEDIFF('2018-08-25 14:00:00', '2018-08-24 01:00:00') time02 # 时间1-时间2,得到时分秒格式
;
/*
+--------+----------+
| time01 | time02 |
+--------+----------+
| 1 | 37:00:00 |
+--------+----------+
1 row in set (0.001 sec)
*/
4.时区转换
SELECT
convert_tz( '2018-08-25 14:00:00', '+08:00', '+00:00' ) time01 # 时区转换,参数2是当前时区,参数3是目标时区
;
/*
+---------------------+
| time01 |
+---------------------+
| 2018-08-25 06:00:00 |
+---------------------+
1 row in set (0.001 sec)
*/
5.时间戳
SELECT
UNIX_TIMESTAMP() time01, # 获取当前时间戳
UNIX_TIMESTAMP('2018-08-25 15:00:00') time02, # 转换一个时间到时间戳
UNIX_TIMESTAMP('1970-01-01 08:00:30') time03, # 时间戳是距离格林威治时间1970-01-01 00:00:00的秒数,我的MySQL在+08:00时区
FROM_UNIXTIME(UNIX_TIMESTAMP()) time04, # 时间戳格式化
FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y-%m-%d') time05 # 指定格式的转换
;
/*
+------------+------------+--------+---------------------+------------+
| time01 | time02 | time03 | time04 | time05 |
+------------+------------+--------+---------------------+------------+
| 1535181977 | 1535180400 | 30 | 2018-08-25 15:26:17 | 2018-08-25 |
+------------+------------+--------+---------------------+------------+
1 row in set (0.001 sec)
*/