内置函数--时间类型

2020-12-28
ADDDATE(date,INTERVAL expr unit)

加31天
ADDDATE('2020-09-22',INTERVAL 31 DAY)
ADDDATE('2020-09-22',31)

将时间值(间隔)添加到日期值 expr是间隔时间,unit是间隔单位

ADDTIME(expr1,expr2)

ADDTIME('2007-12-31 23:59:59.999999', '1 1:1:1.000002')
ADDTIME('01:00:00.999999', '02:00:00.999998')

加时间,expr1是时间或日期时间表达式,并且expr2是时间表达式

CONVERT_TZ(dt,from_tz,to_tz)

将datetime值dt从指定的时区from_tz转换为指定时区to_tz;如果参数无效,则此函数返回NULL;如果TIMESTAMP从from_tz转换为UTC时该值超出了类型的支持范围,则不会进行转换

CURDATE()
CURRENT_DATE()
CURRENT_DATE

返回当前日期,格式具体取决于该函数是在字符串上下文中使用还是在数字上下文中使用 'YYYY-MM-DD'或YYYYMMDD

CURTIME()
CURRENT_TIME
CURRENT_TIME()

返回当前时间,具体取决于该函数是在字符串上下文中还是在数字上下文 'hh:mm:ss'或 hhmmss

CURRENT_TIMESTAMP()
CURRENT_TIMESTAMP
NOW()
LOCALTIME
LOCALTIME([fsp])
LOCALTIMESTAMP
LOCALTIMESTAMP([fsp])

返回当前日期和时间,格式具体取决于该函数是在字符串上下文中还是在数字上下文中使用。'YYYY-MM-DD hh:mm:ss'或YYYYMMDDhhmmss

DATE(expr)

mysql> SELECT DATE('2003-12-31 01:02:03');
        ->'2003-12-31'

提取日期或日期时间表达式expr的日期部分。

DATE_ADD(date,INTERVAL expr unit)
DATE_SUB(date,INTERVAL expr unit)
SUBDATE(date,INTERVAL expr unit)
SUBDATE(expr,days)

该date参数指定开始日期或日期时间值。expr是一个表达式,指定要从开始日期添加或减去的间隔值。expr被评估为字符串;它可能以负数间隔开始。unit是一个关键字,指示应解释表达式的单位。
返回值取决于参数:

  • 如果date参数是一个DATE值,你的计算只涉及YEAR,MONTH和DAY部分(即,没有时间部分)则返回DATE。
  • 如果第一个参数是一个DATETIME(或 TIMESTAMP)值,或者如果第一个参数是一个DATE并且unit使用HOURS,MINUTES或 SECONDS。则为DATETIME。
DATEDIFF(expr1,expr2)

mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');
        -> 1 
mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31');
        -> -31

返回从一个日期到另一个日期的天数的值。expr1和expr2是日期或日期和时间表达式。在计算中仅使用值的日期部分。

DAY(date)
DAYOFMONTH(date)

mysql> SELECT DAYOFMONTH('2007-02-03');
        -> 3

返回日期中月份的日期,范围为1到31,或对于日期,如“0000-00-00”或“2008-00-00”,有零日的部分

DAYOFWEEK(date)

mysql> SELECT DAYOFWEEK('2007-02-03');
        -> 7

返回date的工作日索引。这些索引值对应于ODBC标准。(1=周日,2=周一,…,7=周六)

DAYNAME(date)

mysql> SELECT DAYNAME('2007-02-03');
        ->'星期六'

返回date的工作日名称。

DAYOFYEAR(date)

mysql> SELECT DAYOFYEAR('2007-02-03');
        -> 34

返回date的天数(从1月1日算起),范围为1到366。

EXTRACT(unit FROM date)

mysql> SELECT EXTRACT(YEAR FROM '2019-07-02');
        -> 2019年
mysql> SELECT EXTRACT(YEAR_MONTH FROM '2019-07-02 01:02:03');
        -> 201907
mysql> SELECT EXTRACT(DAY_MINUTE FROM '2019-07-02 01:02:03');
        -> 20102
mysql> SELECT EXTRACT(MICROSECOND FROM '2003-01-02 10:30:00.000123');
        -> 123

从日期中提取部分而不是执行日期算术 unit为时间间隔

FROM_UNIXTIME(unix_timestamp[,format])

mysql> SELECT FROM_UNIXTIME(1447430881);
        -> '2015-11-13 10:08:01'
mysql> SELECT FROM_UNIXTIME(1447430881,'%Y %D %M %h:%i:%s %x');
        -> '2015 13th November 10:08:01 2015'

时间戳转换为时间,返回格式为format 默认为YYYY-MM-DD hh:mm:ss
如果使用UNIX_TIMESTAMP() 和FROM_UNIXTIME()在非UTC时区的值和Unix时间戳值之间进行转换,则转换是有损耗的,因为在两个方向上映射都不是一对一的。

UNIX_TIMESTAMP([date])

mysql> SELECT UNIX_TIMESTAMP();
        -> 1447431666
mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012');
        -> 1447431619.012

如果UNIX_TIMESTAMP()不带任何date参数调用 它将返回一个Unix时间戳,表示自UTC'1970-01-01 00:00:00'以来的秒数。
如果UNIX_TIMESTAMP()使用date参数调用,则返回自UTC'1970-01-01 00:00:00'以来的秒数形式的参数值.如果参数包含时间部分,则可以选择包含小数秒部分。

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'

返回格式字符串。与DATE_FORMAT()和STR_TO_DATE()功能结合使用时,此功能很有用。
第一个和第二个参数的可能值会导致几个可能的格式字符串

DATE_FORMAT(date,format)

根据format字符串 格式化值date

STR_TO_DATE(str,format)

这是DATE_FORMAT()函数的逆函数。它需要一个字符串str和一个格式字符串format。 如果格式字符串同时包含日期和时间部分,则STR_TO_DATE()返回一个 DATETIME值;如果格式字符串仅包含日期或时间部分,则返回一个DATE或TIME值。如果从str中提取的日期,时间或日期时间值不合法,则STR_TO_DATE() 返回NULL并产生警告。

HOUR(time)

mysql> SELECT HOUR('10:05:03');
        -> 10 
mysql> SELECT HOUR('272:59:59');
        -> 272

返回time的小时数。对于一天中的时间值,返回值的范围是0至23的值。但是,TIME值的范围实际上要大得多,因此HOUR返回的值可以大于23。

LAST_DAY(date)

mysql> SELECT LAST_DAY('2003-02-05');
        -> '2003-02-28'
mysql> SELECT LAST_DAY('2004-02-05');
        -> '2004-02-29'
mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
        -> '2004-01-31'
mysql> SELECT LAST_DAY('2003-03-32');
        -> NULL

获取一个date或datetime值,并返回每月最后一天的对应值。如果参数无效,返回NULL

MAKEDATE(year,dayofyear)

mysql> SELECT MAKEDATE(2011,31), MAKEDATE(2011,32);
        ->'2011-01-31','2011-02-01'
mysql> SELECT MAKEDATE(2011,365), MAKEDATE(2014,365);
        ->'2011-12-31','2014-12-31'
mysql> SELECT MAKEDATE(2011,0);
        ->null

返回给定日期和年值的日期。 dayofyear必须大于0,否则结果为NULL。

MAKETIME(hour,minute,second)

根据指定的hour,minute,second返回时间,该second参数可以有小数部分。

MICROSECOND(expr)

mysql> SELECT MICROSECOND('12:00:00.123456');
        -> 123456
mysql> SELECT MICROSECOND('2019-12-31 23:59:59.000010');
        -> 10

返回时间或日期时间表达式expr中的微秒值,范围为从 0到的数字999999。

MINUTE(time)

mysql> SELECT MINUTE('2008-02-03 10:05:03');
        -> 5

返回time的分钟,范围0为59。

MONTH(date)

mysql> SELECT MONTH('2008-02-03');
        -> 2

返回date的月份,范围从1到12

MONTHNAME(date)

mysql> SELECT MONTHNAME('2008-02-03');
        -> 'February'

返回date的月份的全名。名称使用的语言由lc_time_names系统变量的值控制

PERIOD_ADD(P,N)

mysql> SELECT PERIOD_ADD(200801,2);
        -> 200803

将给定日期P加上N个月数;P的格式和返回格式为YYYYMM(P没有日期值)

PERIOD_DIFF(P1,P2)

mysql> SELECT PERIOD_DIFF(200802,200703);
        -> 11

返回日期P1和P2之间的月数,P1、P2格式为(YYMM或YYYYMM)(P1和P2没有日期值)

SEC_TO_TIME(seconds)

mysql> SELECT SEC_TO_TIME(2378);
        -> '00:39:38'
mysql> SELECT SEC_TO_TIME(2378) + 0;
        -> 3938

将seconds参数转换为小时,分钟和秒作为TIME值。结果的范围限制为TIME数据类型的范围。如果参数对应于该范围之外的值,则会发生警告。

SLEEP(duration)

睡眠(暂停)duration参数给出的秒数 ,当正常返回(无中断)时将返回0。持续时间可能有小数部分。如果参数为NULL则SLEEP()在严格的SQL模式下会产生警告或错误。

SUBTIME(expr1,expr2)

mysql> SELECT SUBTIME('2007-12-31 23:59:59.999999','1 1:1:1.000002');
        -> '2007-12-30 22:58:58.999997'
mysql> SELECT SUBTIME('01:00:00.999999', '02:00:00.999998');
        -> '-00:59:59.999999'

返回expr1 − expr2之后的时间。 expr1是时间或日期时间表达式,并且expr2是时间表达式。

TIME(expr)

mysql> SELECT TIME('2003-12-31 01:02:03');
        -> '01:02:03'
mysql> SELECT TIME('2003-12-31 01:02:03.000123');
        -> '01:02:03.000123'

提取时间或日期时间表达式expr的时间部分,并将其作为字符串返回

TIME_FORMAT(time,format)

mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l');
        -> '100 100 04 04 4'

该函数的用法类似于DATE_FORMAT()函数,但format字符串只能包含格式说明符,仅用于小时,分钟,秒和微秒。其他说明符产生一个NULL值或0。
如果该time值包含的小时部分大于23,则%H和%k小时格式说明符产生的值大于通常的范围 0..23。其他小时格式说明符会产生以12为模的小时值。

TIME_TO_SEC(time)

mysql> SELECT TIME_TO_SEC('22:23:00');
        -> 80580
mysql> SELECT TIME_TO_SEC('00:39:38');
        -> 2378

将time参数转换为秒。

TIMEDIFF(expr1,expr2)

mysql> SELECT TIMEDIFF('2000:01:01 00:00:00',
    ->                 '2000:01:01 00:00:00.000001');
        -> '-00:00:00.000001'
mysql> SELECT TIMEDIFF('2008-12-31 23:59:59.000001',
    ->                 '2008-12-30 01:01:01.000002');
        -> '46:58:57.999999'

返回expr1、expr2之间的时间值。 expr1和expr2是时间或日期时间表达式,但两者必须是同一类型。
返回的结果限制为TIME值允许的范围。

TIMESTAMP(expr)
TIMESTAMP(expr1,expr2)

mysql> SELECT TIMESTAMP('2003-12-31');
        ->'2003-12-31 00:00:00'
mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
        ->'2004-01-01 00:00:00'

使用单个参数,此函数将date或datetime表达式expr作为datetime值返回。
使用两个参数将时间表达式expr2添加到日期或日期时间表达式expr1中,并将结果作为日期时间值返回。

TIMESTAMPADD(unit,interval,datetime_expr)

mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02');
        ->'2003-01-02 00:01:00'
mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');
        ->'2003-01-09'

将整数表达式interval添加到date或datetime表达式datetime_expr。interval的单元将被给定unit参数,它应为以下值中的一个:MICROSECOND (微秒),SECOND, MINUTE,HOUR, DAY,WEEK, MONTH,QUARTER或 YEAR。
unit可以使用所示的关键字之一或前缀SQL_TSI_来指定该值。例如,DAY和SQL_TSI_DAY都是合法的。

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
        -> 3
mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
        -> -1
mysql> SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');
        -> 128885

返回datetime_expr2 − datetime_expr1,其中datetime_expr1和datetime_expr2是日期或日期时间表达式。一个表达式可以是日期,另一个可以是日期时间。日期值在必要时被视为具有时间部分('00:00:00')的日期时间。结果的单位(整数)由unit参数指定。

TO_DAYS(date)

mysql> SELECT TO_DAYS(950501);
        -> 728779
mysql> SELECT TO_DAYS('2007-10-07');
        -> 733321

返回给定date的天数(从0年起的天数)。
不适用于公历(1582)出现之前的值,因为它未考虑更改日历时丢失的日期。对于1582年之前的日期(可能在其他地方的较晚年份),此功能的结果不可靠。

TO_SECONDS(expr)

mysql> SELECT TO_SECONDS(950501);
        -> 62966505600
mysql> SELECT TO_SECONDS('2009-11-29');
        -> 63426672000
mysql> SELECT TO_SECONDS('2009-11-29 13:43:32');
        -> 63426721412
mysql> SELECT TO_SECONDS( NOW() );
        -> 63426721458

返回给定日期或日期时间expr自0年以来的秒数。如果expr不是有效的日期或日期时间值,则返回NULL。

UTC_DATE
UTC_DATE()

mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
        ->'2003-08-14',20030814

以格式字符串('YYYY-MM-DD')或数字形式(YYYYMMDD)返回当前UTC日期。

UTC_TIME
UTC_TIME([fsp])

mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
        -> '18:07:53',180753.000000

返回当前UTC时间,值的形式,具体取决于该函数是在字符串上下文中还是在数字上下文中使用。'hh:mm:ss'或hhmmss
如果fsp给定参数指定从0到6的小数秒精度,则返回值包括该位数的小数秒部分。

UTC_TIMESTAMP, UTC_TIMESTAMP([fsp])

mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
        -> '2003-08-14 18:08:04', 20030814180804.000000

返回当前UTC日期和时间,值的形式具体取决于该函数是在字符串上下文中还是在数字上下文中使用。 'YYYY-MM-DD hh:mm:ss'或YYYYMMDDhhmmss
如果fsp给定参数指定从0到6的小数秒精度,则返回值包括该位数的小数秒部分

WEEK(date[,mode])

返回date的星期数。WEEK()您可以指定星期是从星期日还是星期一开始,以指定值应在从0到53或从1到53的范围内。如果省略mode参数,则使用系统变量default_week_format的值

mode参数

模式 一周的第一天 范围 第一周是第一周…
0 星期日 0-53 今年的一个星期天
1个 星期一 0-53 今年有四天或以上
2 星期日 1-53 今年的一个星期天
3 星期一 1-53 今年有四天或以上
4 星期日 0-53 今年有四天或以上
5 星期一 0-53 今年的星期一
6 星期日 1-53 今年有四天或以上
7 星期一 1-53 今年的星期一

对于意义为“今年有4天或以上”的模式值,根据ISO 8601:1988对周进行编号:

  • 如果包含1月1日的那一周在新年中有4天或更多,它就是第1周。
  • 否则,它就是上一年的最后一周,而下一周则是第一周。
mysql> SELECT WEEK('2008-02-20');
        -> 7
mysql> SELECT WEEK('2008-02-20',0);
        -> 7
mysql> SELECT WEEK('2008-02-20',1);
        -> 8
mysql> SELECT WEEK('2008-12-31',1);
        -> 53

如果一个日期落在前一年的最后一周,MySQL返回0,如果没有使用2,3,6,或7作为可选的mode参数

mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
        -> 2000, 0
WEEKDAY(date)

mysql> SELECT WEEKDAY('2008-02-03 22:23:00');
        -> 6
mysql> SELECT WEEKDAY('2007-11-06');
        -> 1

返回date的工作日索引(0=星期一,1=星期二,… 6=星期日)。

WEEKOFYEAR(date)

mysql> SELECT WEEKOFYEAR('2008-02-20');
        -> 8

返回日期的日历周,范围是从1到53。 WEEKOFYEAR()是等效于WEEK(date,3)的兼容性函数

YEAR(date)

mysql> SELECT YEAR('1987-01-01');
        -> 1987

返回date的年分,在范围1000至9999,或为0的日期。

YEARWEEK(date)
YEARWEEK(date,mode)

mysql> SELECT YEARWEEK('1987-01-01');
        -> 198652

返回日期的年和周。结果中的年份可能与该年份的第一周和最后一周的date参数中的年份不同。
该mode参数的与WEEK()的mode参数工作原理完全一样。与WEEK()不同,default_week_format的值不会影响YEARWEEK()

QUARTER(date)

mysql> SELECT QUARTER('2008-04-01');
        -> 2

返回date的季度,范围1到4。

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)
%s	秒(00.. 59)
%T	时间24小时(hh:mm:ss)
%U	周(00.. 53),其中星期日是一周的第一天; WEEK()模式为0
%u	星期(00.. 53),其中星期一是星期的第一天; WEEK()模式为1
%V	周(01.. 53),其中星期日是一周的第一天; WEEK()模式为2; 用于 %X
%v	星期(01.. 53),其中星期一是星期的第一天; WEEK()模式为3; 用于 %x
%W	工作日名称(Sunday.. Saturday)
%w	星期几(0=星期天.. 6=星期六)
%X	一周的年份,其中星期日是一周的第一天,数字,四位数;用于%V
%x	一周的年份,其中星期一是一周的第一天,数字,四位数;用于%v
%Y	年,数字,四位数
%y	年,数字(两位数字)
%%	文字%字符
%x	对于上面未列出的任何 “x”

UNIT

MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
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

 

{/if}