日期函数
日期函数
当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。在讨论日期查询的复杂性之前,我们先来看看最重要的内建日期处理函数。
下表列出了 MySQL 中最重要的内建日期函数:
函数描述
-----------------------------------------------------------------
NOW() 返回当前的日期和时间
CURDATE() 返回当前的日期
CURTIME() 返回当前的时间
DATE() 提取日期或日期/时间表达式的日期部分
EXTRACT() 返回日期/时间按的单独部分
DATE_ADD() 给日期添加指定的时间间隔
DATE_SUB() 从日期减去指定的时间间隔
DATEDIFF() 返回两个日期之间的天数
DATE_FORMAT() 用不同的格式显示日期/时间
------------------------------------------------------------------
日期函数用于调整日期和时间数据的外观,以适当的方式显示日期和时间数据、进行比较、计算日期之间的间隔等。
一、格式转化
1、DATE_FORMAT 函数
语法: DATE_FORMAT(date,format)
描述:根据 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或PM)
%s 秒 (00..59)
%T 时间 , 24小时制 (小时hh:分钟mm:秒数ss)
%u 周 (00..53), 其中周一为每周的第一天
%v 周 (01..53), 其中周一为每周的第一天 ; 和 %x同时使用
%W 工作日名称 (周日..周六)
%w 一周中的每日 (0=周日..6=周六)
%x 该周的年份,其中周一为每周的第一天, 数字形式,4位数;和%v同时使用
%Y 年份, 数字形式,4位数
%y 年份, 数字形式,2位数
------------------------------------------------------------------------------------------
例:
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
'Saturday October 1997'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
'22:23:00'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
'4th 97 Sat 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
'22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
'1998 52'
2、STR_TO_DATE 函数
语法:STR_TO_DATE(str,format)
描述:这是DATE_FORMAT() 函数的倒转。若格式字符串 str 包含日期和时间部分,则返回一个 DATETIME 值, 若 str 只包含日期部分或时间部分,则返回一个 DATE 或 TIME 值。str 所包含的日期、时间或日期时间值应该在 format 指示的格式中被给定。若 str 包含一个非法日期、时间或日期时间值,则返回NULL。
mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y');
'0000-00-00'
mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y');
'2004-04-31'
二、取得日期时间差
DATEDIFF() 返回两个日期之间的天数。
语法:DATEDIFF(expr,expr2)
描述:返回起始时间 expr 和结束时间 expr2 之间的天数。Expr 和expr2 为日期或 date-and-time 表达式。计算中只用到这些值的日期部分。
mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
1
mysql> SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31');
-31
三、日期的加减运算
1、给日期添加指定的时间间隔 DATE_ADD()
语法:DATE_ADD(date, INTERVAL expr type)
描述:执行日期加法运算。 date 是 DATETIME 或 DATE 值,用来指定起始时间。expr 是一个表达式,用来指定从起始日期添加的时间间隔值。
mysql> SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL 1 SECOND);
'1998-01-01 00:00:00'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL 1 DAY);
'1998-01-01 23:59:59'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND);
'1998-01-01 00:01:00'
mysql> SELECT DATE_ADD('1998-01-01 00:00:00', INTERVAL '-1 10' DAY_HOUR);
'1997-12-30 14:00:00'
mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002', INTERVAL '1.999999' SECOND_MICROSECOND);
'1993-01-01 00:00:01.000001'
2、从日期减去指定的时间间隔 DATE_SUB()
语法:DATE_SUB(date,INTERVAL expr type)
描述:执行日期减法运算。 date 是 DATETIME 或 DATE 值,用来指定起始时间。expr 是一个表达式,用来指定从起始日期减去的时间间隔值。
mysql> SELECT DATE_SUB('1998-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND);
'1997-12-30 22:58:59'
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
'1997-12-02'
假如你对一个日期值添加或减去一些含有时间部分的内容,则结果自动转化为一个日期时间值:
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY);
'1999-01-02'
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR);
'1999-01-01 01:00:00'
假如你使用了格式严重错误的日期,则结果为 NULL。
假如你添加了 MONTH、YEAR_MONTH 或 YEAR,而结果日期中有一天的日期大于添加的月份的日期最大限度,则这个日期自动被调整为添加月份的最大日期。
mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
'1998-02-28'
四、取得部分日期信息
1、提取日期部分 DATE()
语法:DATE(expr)
描述:提取日期或时间日期表达式expr中的日期部分。
mysql> SELECT DATE('2003-12-31 01:02:03');
'2003-12-31'
2、返回日期/时间值的单独部分 EXTRACT()
语法:EXTRACT(type FROM date)
说明:EXTRACT()函数所使用的时间间隔类型说明符同 DATE_ADD()或DATE_SUB()的相同,但它从日期中提取其单独部分,而不是执行日期运算。
mysql> SELECT EXTRACT(YEAR FROM '1999-07-02');
1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03');
199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM '1999-07-02 01:02:03');
20102
mysql> SELECT EXTRACT(MICROSECOND FROM '2003-01-02 10:30:00.00123');
123
3、日期描述
日期描述由格式元素组成,用于以期望的格式提取日期和时间信息。
(1)QUARTER(date)
返回date 对应的一年中的季度值,范围是从 1到 4。
mysql> SELECT QUARTER('98-04-01');
2
(2)MONTH(date)
返回 date 对应的月份,范围时从 1 到 12。
mysql> SELECT MONTH('1998-02-03');
2
(3)MONTHNAME(date)
返回date 对应月份的全名。
mysql> SELECT MONTHNAME('1998-02-05');
'February '
(4)HOUR(time)
返回time 对应的小时数。对于小时数的返回值范围是从 0 到 23 。
mysql> SELECT HOUR('10:05:03');
10
(5)MINUTE(time)
返回 time 对应的分钟数,范围是从 0 到 59。
mysql> SELECT MINUTE('98-02-03 10:05:03');
5
(6)SECOND(time)
返回time 对应的秒数, 范围是从 0到59。
mysql> SELECT SECOND('10:05:03');
3
五、其他日期函数
1、DAYOFYEAR(date)
返回date 对应的一年中的天数,范围是从 1到366。
mysql> SELECT DAYOFYEAR('1998-02-03');
34
2、DAYOFMONTH(date)
返回date 对应的该月日期,范围是从 1到31。
mysql> SELECT DAYOFMONTH('1998-02-03');
3
3、DAYOFWEEK(date)
返回date (1 = 周日, 2 = 周一, ..., 7 = 周六)对应的工作日索引。
mysql> SELECT DAYOFWEEK('1998-02-03');
3
4、DAYNAME(date)
返回date 对应的工作日名称。
mysql> SELECT DAYNAME('1998-02-05');
'周四'