MySQL日期和时间函数

# MySQL日期和时间函数

- ADDDATE(EXPR, DAYS)

含义:向日期加上指定的天数

示例:

SELECT ADDDATE('2016-01-01', 7);

在 **2016-01-01** 日期中增加 **7** 天,计算结果:

> 2016-01-08

- ADDDATE(DATE, INTERVAL EXPR UNIT)

含义:向日期加上指定的时间间隔

示例:

```

SELECT ADDDATE('2016-01-01', INTERVAL 31 DAY);

```

在 **2016-01-01** 日期中增加 **31** 天,计算结果:

> 2016-02-01

```

SELECT ADDDATE('2016-01-01', INTERVAL 6 MONTH);

```

在 **2016-01-01** 日期中增加 **6** 个月,计算结果:

> 2016-07-01

```

SELECT ADDDATE('2016-01-01', INTERVAL 2 QUARTER);

```

在 **2016-01-01** 日期中增加 **2** 季度,计算结果:

> 2016-07-01

```

SELECT ADDDATE('2016-01-01', INTERVAL -1 YEAR);

```

在 **2016-01-01** 日期中增加 **-1** 年(也就是减一年),计算结果:

>

```

2015-01-01

```

- DATE_ADD(DATE, INTERVAL EXPR UNIT)

含义:相同于 **ADDDATE** 函数

- SUBDATE(EXPR, DAYS)

含义:向日期减去指定的天数,与 **ADDDATE** 反义

示例:

```

SELECT SUBDATE('2016-01-01', 1);

```

在 **2016-01-01** 日期中减去 **1** 天,计算结果:

> 2015-12-31

- SUBDATE(DATE, INTERVAL EXPR UNIT)

含义:向日期减去指定的时间间隔,与 **ADDDATE** 反义

示例:

```

SELECT SUBDATE('2016-01-01', INTERVAL 1 QUARTER);

```

在日期 **2016-01-01** 中减去 **1** 季度,计算结果:

> 2015-10-01

- DATE_SUB(DATE, INTERVAL EXPR UNIT)

含义:相同于 **SUBDATE** 函数

- ADDTIME(EXPR1, EXPR2)

含义:在日期 **EXPR1** 中加上 **EXPR2**

示例:

```

SELECT ADDTIME("2016-01-01 00:00:00", "01:00:00");

```

在日期 **2016-01-01 00:00:00** 中增加 **01:00:00** ,计算结果:

> 2016-01-01 01:00:00

- SUBTIME(EXPR1, EXPR2)

含义:在日期 **EXPR1** 中减去 **EXPR2**

示例:

```

SELECT SUBTIME("2016-01-01 01:00:00", "01:00:00");

```

在日期 **2016-01-01 01:00:00** 减去 **01:00:00**,计算结果:

> 2016-01-01 00:00:00

- CONVERT_TZ(DATE, FROM_TZ, TO_TZ)

含义:将 **FROM_TZ** 时区的时间转换为 **TO_TZ** 时区的时间

示例:

```

SELECT CONVERT_TZ('2016-10-01 08:00:00', '+08:00', '+9:00');

```

将 **+08:00** 时区的日期 **2016-10-01 08:00:00** 转换为 **+9:00** 时区的日期,计算结果:

> 2016-10-01 09:00:00

- CURDATE()

含义:当前日期

示例:

```

SELECT CURDATE();

```

获取当前日期,计算结果:

> 2016-01-01

- CURRENT_DATE()

含义:相同于 **CURDATE** 函数

- CURTIME()

含义:当前时间

示例:

```

SELECT CURTIME();

```

获取当前时间,计算结果:

> 02:20:56

- CURRENT_TIME()

含义:相同于 **CURTIME** 函数

- NOW()

含义:当前日期时间

示例:

```

SELECT NOW();

```

获取当前的日期时间,计算结果:

> 2016-01-01 02:22:51

- LOCALTIME()

含义:相同于 **NOW** 函数

- LOCALTIMESTAMP()

含义:相同于 **NOW** 和 **LOCALTIME** 函数

- SYSDATE()

含义:当前的系统日期时间

示例:

```

SELECT SYSDATE();

```

获取当前的系统日期时间,计算结果:

> 2016-01-01 02:23:20

- DATE(EXPR)

含义:提取 **EXPR** 的日期部分

示例:

```

SELECT DATE('2016-01-01 08:00:00');

```

提取日期,计算结果:

> 2016-01-01

- TIME(EXPR)

含义:提取 **EXPR** 的时间部分

示例:

```

SELECT DATE('2016-01-01 08:02:00');

```

提取时间,计算结果:

> 08:02:00

- DATEDIFF(EXPR1, EXPR2)

含义:计算 **EXPR1** 和 **EXPR2** 日期间隔

示例:

```

SELECT DATEDIFF('2016-01-01 08:00:00', '2016-01-02 08:00:00');

```

计算时间 **2016-01-01 08:00:00** 和时间 **2016-01-02 08:00:00**  的日期间隔,计算结果:

> -1

- TIMEDIFF(EXPR1, EXPR2)

含义:计算 **EXPR1** 和 **EXPR2** 时间间隔

示例:

```

SELECT DATEDIFF('2016-01-01 08:00:00', '2016-01-02 08:00:01');

```

计算时间 **2016-01-01 08:00:00** 和时间 **2016-01-02 08:00:01**  的时间间隔,计算结果:

> -1

- DATE_FORMAT(DATE, FORMAT)

含义:格式化日期

可用格式化参数:

格式符|说明

---|---

%a|工作日的缩写名称(Sun..Sat)

%b|月份的缩写名称(Jan..Dec)

%c|月份,数字形式(0..12)

%D|带有英语后缀的该月日期(0th, 1st, 2nd, 3rd, ...)

%d|该月日期,数字形式(00..31)

%e|该月日期,数字形式(0..31)

%f|微秒(000000..999999)

%H|小时(00..23)

%h|小时(01..12)

%I|小时(01..12)

%i|分钟,数字形式(00..59)

%j|一年中的天数,(001..366)

%k|小时(0..23)

%l|小时(1..12)

%M|月份名称(January..December)

%m|月份,数字形式(00..12)

%p|上午(AM)或下午(PM)

%r|时间,12 小时制 (hh:mm:ss AM or 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|工作日名称(Sunday..Saturday)

%w|一周中的每日(0=周日..6=周六)

%X|该周的年份,其中周日为每周的第一天,数字形式,4位数;和%V同时使用

%x|该周的年份,其中周一为每周的第一天,数字形式,4位数;和%v同时使用

%Y|年份,数字形式,4位数

%y|年份,数字形式,2位数

%%|% 字符

示例:

```

SELECT DATE_FORMAT('2016-10-01 08:00:00', '%W %M %Y');

```

格式化时间,计算结果:

> Wednesday October 2014

- STR_TO_DATE(STR, FORMAT)

含义:相反与 **DATE_FORMAT** 函数,将给定的字符串 **STR** 按  **FORMAT** 格式解析成日期

- TIME_FORMAT(TIME, FORMAT)

含义:用法与 **DATE_FORMAT** 一样,但可能只处理时,分,秒和微秒

示例:

```

SELECT TIME_FORMAT('16:30:00', '%h:%i %p');

```

计算结果:

> 04:30 PM

- DAYOFMONTH(DATE)

含义:该月份的第几天

示例:

```

SELECT DAYOFMONTH('2016-01-01');

```

计算结果:

> 1

- DAYOFYEAR(DATE)

含义:该年的第几天

示例:

```

SELECT DAYOFMONTH('2016-01-01');

```

计算结果:

> 1

- DAYOFWEEK(DATE)

含义:星期对应的索引值(1表示周日,2表示周一,……7 表示周六)

示例:

```

SELECT DAYOFWEEK('2016-01-01');

```

计算结果:

> 6

- WEEKDAY(DATE)

含义:星期对应的索引值(0表示周一,1表示周二,……6 表示周日)

示例:

```

SELECT WEEKDAY('2016-01-01');

```

计算结果:

> 4

- DAYNAME(DATE)

含义:星期的名称

示例:

```

SELECT DAYNAME('2016-01-01');

```

计算结果:

> Friday

- MONTHNAME(DATE)

含义:月份的名称

示例:

```

SELECT MONTHNAME('2016-01-01');

```

计算结果:

> January

- EXTRACT(UNIT FROM DATE)

含义:提取日期 **DATE** 中的 **UNIT** 部分

示例:

```

SELECT EXTRACT(YEAR FROM '2016-01-01');

```

计算结果:

> 2016

- FROM_UNIXTIME(UNIX_TIMESTAMP)

含义:将时间戳 **UNIX_TIMESTAMP** 格式化成字符串形式

示例:

```

SELECT FROM_UNIXTIME(1414066392);

```

计算结果:

> 2014-10-23 20:13:12

- FROM_UNIXTIME(UNIX_TIMESTAMP, FORMAT)

含义:相同于 **FROM_UNIXTIME** 函数,FORMAT 相同于 **DATE_FORMAT**

- GET_FORMAT({DATE|TIME|DATETIME}, {'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'})

含义:返回一个格式字符串

可用参数:

函数调用|结果

---|---

GET_FORMAT(DATE,'USA')|'%m.%d.%Y'

GET_FORMAT(DATE,'JIS')|'%Y-%m-%d'

GET_FORMAT(DATE,'ISO')|'%Y-%m-%d'

GET_FORMAT(DATE,'EUR')|'%d.%m.%Y'

GET_FORMAT(DATE,'INTERNAL')|'%Y%m%d'

GET_FORMAT(DATETIME,'USA')|'%Y-%m-%d-%H.%i.%s'

GET_FORMAT(DATETIME,'JIS')|'%Y-%m-%d %H:%i:%s'

GET_FORMAT(DATETIME,'ISO')|'%Y-%m-%d %H:%i:%s'

GET_FORMAT(DATETIME,'EUR')|'%Y-%m-%d-%H.%i.%s'

GET_FORMAT(DATETIME,'INTERNAL')|'%Y%m%d%H%i%s'

GET_FORMAT(TIME,'USA')|'%h:%i:%s %p'

GET_FORMAT(TIME,'JIS')|'%H:%i:%s'

GET_FORMAT(TIME,'ISO')|'%H:%i:%s'

GET_FORMAT(TIME,'EUR')|'%H.%i.%S'

GET_FORMAT(TIME,'INTERNAL')|'%H%i%s'

示例:

```

SELECT GET_FORMAT(DATE, 'EUR');

```

计算结果:

> %d.%m.%Y

- LAST_DAY(DATE)

含义:当月的最后一天

示例:

```

SELECT LAST_DAY('2016-01-01');

```

计算结果:

> 31

- YEAR(DATE)

含义:日期对应的年份

示例:

```

SELECT YEAR('2016-01-01');

```

计算结果:

> 2016

- QUARTER(DATE)

含义:日期对应的季度

示例:

```

SELECT QUARTER('2016-01-01');

```

计算结果:

> 1

- MONTH(DATE)

含义:日期对应的月份

示例:

```

SELECT MONTH('2016-01-01');

```

计算结果:

> 1

- WEEK(DATE[, MODE])

含义:日期对应的星期数

参数 **MODE** 为计算规则:

MODE|一周的第一天|范围|第几周

---|---|---|---

0|星期日|0-53|今年的一个星期日

1|星期一|0-53|4天或更多天

2|星期日|1-53|今年的周日

3|星期一|1-53|4天或更多天

4|星期日|0-53|4天或更多天

5|星期一|0-53|今年的周日

6|星期日|1-53|4天或更多天

7|星期一|1-53|今年的周日

示例:

```

SELECT WEEK('2014-01-01', 1);

```

计算结果:

> 1

暂时没有研究明白该函数是干什么用?

- DAY(DATE)

含义:相同与 **DAYOFMONTH** 函数

- HOUR(TIME)

含义:时间对应的小时数

示例:

```

SELECT HOUR('12:20:15');

```

计算结果:

> 12

- MINUTE(TIME)

含义:时间对应的分钟数

示例:

```

SELECT HOUR('12:20:15');

```

计算结果:

> 20

- SECOND(TIME)

含义:时间对应的秒数

示例:

```

SELECT HOUR('12:20:15');

```

计算结果:

> 15

- MICROSECOND(EXPR)

含义:时间表达式 **EXPR** 对应的微秒数

示例:

```

SELECT MICROSECOND('12:00:00.123456');

```

计算结果:

> 123456

- MAKEDATE(YEAR, DAYFORYEAR)

含义:根据给定的年份和天数得到一个日期

示例:

```

SELECT MAKEDATE(2016, 32);

```

计算结果:

> 2016-02-01

- MAKETIME(HOUR, MINUTE, SECOND)

含义:根据给定的时分秒得到一个时间

示例:

```

SELECT MAKETIME(12,30,0);

```

计算结果:

> 12:30:00

- PERIOD_ADD(P, N)

含义:添加 **N** 个月至周期 **P** (格式为 **YYMM** 或 **YYYYMM** ),返回格式为 **YYYYMM** ,注意周期参数不是日期值

示例:

```

SELECT PERIOD_ADD(201601, 3);

```

计算结果:

> 201604

- PERIOD_DIFF(P1, P2)

含义:返回周期 **P1** 和 **P2** 之间的月份数, **P1** 和 **P2** 的格式为 **YYMM** 或 **YYYYMM**,注意周期参数不是日期值

示例:

```

SELECT PERIOD_DIFF(201601, 1501);

```

计算结果:

> 12

- SEC_TO_TIME(SECONDS)

含义:将给定的秒数转换成时分秒格式

示例:

```

SELECT SEC_TO_TIME(3661);

```

计算结果:

> 01:01:01

```

SELECT SEC_TO_TIME(3661) + 0;

```

计算结果:

> 10101

- TIME_TO_SEC(TIME)

含义:将时间 time 转换为秒数

示例:

```

SELECT TIME_TO_SEC('02:00:01');

```

计算结果:

> 7201

- TIMESTAMP(EXPR)

含义:表达式 **EXPR** 的日期时间值

示例:

```

SELECT TIMESTAMP('2016-01-01');

```

计算结果:

> 2016-01-01 00:00:00

- TIMESTAMP(EXPR1, EXPR2)

含义:将表达式 **EXPR2** 添加到表达式 **EXPR1** 的结果的日期时间值

示例:

```

SELECT TIMESTAMP('2016-01-01 12:00:00','12:00:00');

```

计算结果:

> 2016-01-02 00:00:00

- TIMESTAMPADD(UNIT, INTERVAL, DATAETIME_EXPR)

含义:向给定的日期时间值加上指定的时间间隔

示例:

```

SELECT TIMESTAMPADD(MONTH, 1, '2016-01-01 12:00:00');

```

计算结果:

> 2016-02-01 12:00:00

- TIMESTAMPDIFF(UNIT, DATAETIME_EXPR1, DATAETIME_EXPR2)

含义:日期时间表达式 **DATAETIME_EXPR1** 和 **DATAETIME_EXPR2** 的时间间隔,单位由 **UNIT** 给定

示例:

```

SELECT TIMESTAMPDIFF(HOUR, '2016-01-01 12:00:00', '2016-01-01 13:30:00');

```

计算结果:

> 1

- UNIX_TIMESTAMP()

含义:当前时间的 **UNIX** 时间戳

示例:

```

SELECT UNIX_TIMESTAMP();

```

计算结果:

> 1414330231

- UNIX_TIMESTAMP(DATE)

含义:**DATE** 对应的 **UNIX** 时间戳

示例:

```

SELECT UNIX_TIMESTAMP('2014-10-01 12:00:00');

```

计算结果:

> 1412136000

- UTC_DATE()

含义:当前的 **UTC** 日期

示例:

```

SELECT UTC_DATE();

```

计算结果:

> 2016-01-01

- UTC_TIME()

含义:当前的 **UTC** 时间

示例:

```

SELECT UTC_TIME();

```

计算结果:

> 13:31:18

- UTC_TIMESTAMP()

含义:当前的 **UTC** 日期时间

示例:

```

SELECT UTC_TIMESTAMP();

```

计算结果:

> 2016-01-02 13:31:18

- WEEKOFYEAR(DATE)

含义:相同与 **WEEK** 函数

- YEARWEEK(DATE[, MODE])

含义:日期对应的年份和星期数,参数 **MODE** 与 **WEEK** 函数相同。

示例:

```

SELECT YEARWEEK('2014-01-01');

```

计算结果:

> 201352

推荐阅读更多精彩内容