【MySQL基础教程】时间处理函数

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)
%pAM 或 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)
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值