MySQL基础教程9 —— 函数之日期和时间函数
下面的例子使用了时间函数。以下询问选择了最近的30天内所有带有date_col值的记录:
mysql>SELECTsomethingFROMtbl_name
->WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <=date_col;
注意,这个询问也能选择将来的日期记录。
用于日期值的函数通常会接受时间日期值而忽略时间部分。而用于时间值的函数通常接受时间日期值而忽略日期部分。
返回各自当前日期或时间的函数在每次询问执行开始时计算一次。这意味着在一个单一询问中,对诸如NOW()的函数多次访问总是会得到同样的结果(未达到我们的目的,单一询问也包括对存储程序或触发器和被该程序/触发器调用的所有子程序的调用)。这项原则也适用于CURDATE()、CURTIME()、UTC_DATE()、UTC_TIME()、UTC_TIMESTAMP(),以及所有和它们意义相同的函数。
CURRENT_TIMESTAMP()、CURRENT_TIME()、CURRENT_DATE()以及FROM_UNIXTIME()函数返回连接当前时区内的值,这个值可用作time_zone系统变量的值。此外,UNIX_TIMESTAMP()假设其参数为一个当前时区的时间日期值。
以下函数的论述中返回值的范围会请求完全日期。 若一个日期为“零” 值,或者是一个诸如’2001-11-00’之类的不完全日期, 提取部分日期值的函数可能会返回0。 例如,DAYOFMONTH(’2001-11-00’)会返回0。
ADDDATE(date,INTERVALexprtype) ADDDATE(expr,days)当被第二个参数的INTERVAL格式激活后,ADDDATE()就是DATE_ADD()的同义词。相关函数SUBDATE()则是DATE_SUB()的同义词。对于INTERVAL参数上的信息 ,请参见关于DATE_ADD()的论述。
mysql>SELECT DATE_ADD(’1998-01-02’, INTERVAL 31 DAY);
-> ’1998-02-02’
mysql>SELECT ADDDATE(’1998-01-02’, INTERVAL 31 DAY);
-> ’1998-02-02’
若days参数只是整数值,则MySQL 5.1将其作为天数值添加至expr。
mysql>SELECT ADDDATE(’1998-01-02’, 31);
-> ’1998-02-02’
ADDTIME(expr,expr2)ADDTIME()将expr2添加至expr然后返回结果。expr是一个时间或时间日期表达式,而expr2是一个时间表达式。
mysql>SELECT ADDTIME(’1997-12-31 23:59:59.999999’,
-> ’1 1:1:1.000002’);
-> ’1998-01-02 01:01:01.000001’
mysql>SELECT ADDTIME(’01:00:00.999999’, ’02:00:00.999998’);
-> ’03:00:01.999997’
CONVERT_TZ(dt,from_tz,to_tz)CONVERT_TZ()将时间日期值dt从from_tz给出的时区转到to_tz给出的时区,然后返回结果值。若自变量无效,则这个函数会返回NULL。
在从若from_tz到UTC的转化过程中,该值超出TIMESTAMP类型的被支持范围,那么转化不会发生。
mysql>SELECT CONVERT_TZ(’2004-01-01 12:00:00’,’GMT’,’MET’);
-> ’2004-01-01 13:00:00’
mysql>SELECT CONVERT_TZ(’2004-01-01 12:00:00’,’+00:00’,’+10:00’);
-> ’2004-01-01 22:00:00’
注释:若要使用诸如’MET’或’Europe/Moscow’之类的指定时间区,首先要设置正确的时区表。
CURDATE()将当前日期按照’YYYY-MM-DD’或YYYYMMDD格式的值返回,具体格式根据函数用在字符串或是数字语境中而定。
mysql>SELECT CURDATE();
-> ’1997-12-15’
mysql>SELECT CURDATE() + 0;
-> 19971215
CURRENT_DATE CURRENT_DATE()CURRENT_DATE和CURRENT_DATE()是的同义词.
CURTIME()将当前时间以’HH:MM:SS’或HHMMSS的格式返回, 具体格式根据函数用在字符串或是数字语境中而定。
mysql>SELECT CURTIME();
-> ’23:50:26’
mysql>SELECT CURTIME() + 0;
-> 235026
CURRENT_TIME, CURRENT_TIME()CURRENT_TIME和CURRENT_TIME()是CURTIME()的同义词。
CURRENT_TIMESTAMP, CURRENT_TIMESTAMP()CURRENT_TIMESTAMP和CURRENT_TIMESTAMP()是NOW()的同义词。
DATE(expr)提取日期或时间日期表达式expr中的日期部分。
mysql>SELECT DATE(’2003-12-31 01:02:03’);
-> ’2003-12-31’
DATEDIFF(expr,expr2)DATEDIFF()返回起始时间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
DATE_ADD(date,INTERVALexprtype) DATE_SUB(date,INTERVALexprtype)这些函数执行日期运算。date是一个DATETIME或DATE值,用来指定起始时间。expr是一个表达式,用来指定从起始日期添加或减去的时间间隔值。Expr是一个字符串;对于负值的时间间隔,它可以以一个 ‘-’开头。type为关键词,它指示了表达式被解释的方式。
关键词INTERVA及type分类符均不区分大小写。
以下表显示了type和expr参数的关系:
type值预期的expr格式MICROSECONDMICROSECONDSSECONDSECONDSMINUTEMINUTESHOURHOURSDAYDAYSWEEKWEEKSMONTHMONTHSQUARTERQUARTERSYEARYEARSSECOND_MICROSECOND’SECONDS.MICROSECONDS’MINUTE_MICROSECOND’MINUTES.MICROSECONDS’MINUTE_SECOND’MINUTES:SECONDS’HOUR_MICROSECOND’HOURS.MICROSECONDS’HOUR_SECOND’HOURS:MINUTES:SECONDS’HOUR_MINUTE’HOURS:MINUTES’DAY_MICROSECOND’DAYS.MICROSECONDS’DAY_SECOND’DAYS HOURS:MINUTES:SECONDS’DAY_MINUTE’DAYS HOURS:MINUTES’DAY_HOUR’DAYS HOURS’YEAR_MONTH’YEARS-MONTHS’MySQL允许任何expr格式中的标点分隔符。表中所显示的是建议的 分隔符。若date参数是一个DATE值,而你的计算只会包括YEAR、MONTH和DAY部分(即,没有时间部分),其结果是一个DATE值。否则,结果将是一个DATETIME值。
若位于另一端的表达式是一个日期或日期时间值 , 则INTERVALexprtype只允许在+操作符的两端。对于 –操作符, INTERVALexprtype只允许在其右端,原因是从一个时间间隔中提取一个日期或日期时间值是毫无意义的。(见下面的例子)。
mysql>SELECT ’1997-12-31 23:59:59’ + INTERVAL 1 SECOND;
-> ’1998-01-01 00:00:00’
mysql>SELECT INTERVAL 1 DAY + ’1997-12-31’;
-> ’1998-01-01’
mysql>SELECT ’1998-01-01’ - INTERVAL 1 SECOND;
-> ’1997-12-31 23:59:59’
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_SUB(’1998-01-01 00:00:00’,
->INTERVAL ’1 1:1:1’ DAY_SECOND);
-> ’1997-12-30 22:58:59’
mysql>SELECT DATE_ADD(’1998-01-01 00:00:00’,
->INTERVAL ’-1 10’ DAY_HOUR);
-> ’1997-12-30 14:00:00’
mysql>SELECT DATE_SUB(’1998-01-02’, INTERVAL 31 DAY);
-> ’1997-12-02’
mysql>SELECT DATE_ADD(’1992-12-31 23:59:59.000002’,
->INTERVAL ’1.999999’ SECOND_MICROSECOND);
-> ’1993-01-01 00:00:01.000001’
若你指定了一个过于短的时间间隔值(不包括type关键词所预期的所有时间间隔部分), MySQL假定你已经省去了时间间隔值的最左部分。 例如,你指定了一种类型的DAY_SECOND,expr的值预期应当具有天、 小时、分钟和秒部分。若你指定了一个类似’1:10’的值, MySQL假定天和小时部分不存在,那么这个值代表分和秒。换言之, ’1:10’ DAY_SECOND被解释为相当于’1:10’ MINUTE_SECOND。这相当于MySQL将TIME值解释为所耗费的时间而不是日时的解释方式。
假如你对一个日期值添加或减去一些含有时间部分的内容,则结果自动转化为一个日期时间值:
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’
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)%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位数)%%‘%’文字字符所有其它字符都被复制到结果中,无需作出解释。
注意, ‘%’字符要求在格式指定符之前。
月份和日期说明符的范围从零开始,原因是MySQL允许存储诸如’2004-00-00’的不完全日期.
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’DAY(date)
DAY()和DAYOFMONTH()的意义相同。
DAYNAME(date)返回date对应的工作日名称。
mysql>SELECT DAYNAME(’1998-02-05’);
-> ’周四’
DAYOFMONTH(date)返回date对应的该月日期,范围是从1到31。
mysql>SELECT DAYOFMONTH(’1998-02-03’);
-> 3
DAYOFWEEK(date)返回date(1 =周日, 2 =周一, ..., 7 =周六)对应的工作日索引。这些索引值符合ODBC标准。
mysql>SELECT DAYOFWEEK(’1998-02-03’);
-> 3
DAYOFYEAR(date)返回date对应的一年中的天数,范围是从1到366。
mysql>SELECT DAYOFYEAR(’1998-02-03’);
-> 34
EXTRACT(typeFROMdate)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
FROM_DAYS(N)给定一个天数N,返回一个DATE值。
mysql>SELECT FROM_DAYS(729669);
-> ’1997-10-07’
使用FROM_DAYS()处理古老日期时,务必谨慎。他不用于处理阳历出现前的日期(1582)。
FROM_UNIXTIME(unix_timestamp) , FROM_UNIXTIME(unix_timestamp,format)返回’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS格式值的unix_timestamp参数表示,具体格式取决于该函数是否用在字符串中或是数字语境中。
若format已经给出,则结果的格式是根据format字符串而定。format可以包含同DATE_FORMAT()函数输入项列表中相同的说明符。
mysql>SELECT FROM_UNIXTIME(875996580);
-> ’1997-10-04 22:23:00’
mysql>SELECT FROM_UNIXTIME(875996580) + 0;
-> 19971004222300
mysql>SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
->’%Y %D %M %h:%i:%s %x’);
-> ’2003 6th August 06:22:58 2003’
GET_FORMAT(DATE|TIME|DATETIME, ’EUR’|’USA’|’JIS’|’ISO’|’INTERNAL’)返回一个格式字符串。这个函数在同DATE_FORMAT()及STR_TO_DATE()函数结合时很有用。
第一个参数的3个可能值和第二个参数的5个可能值产生15个可能格式字符串(对于使用的说明符,请参见DATE_FORMAT()函数说明表)。
函数调用结果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’ISO格式为ISO 9075,而非ISO 8601.
也可以使用TIMESTAMP,这时GET_FORMAT()的返回值和DATETIME相同。
mysql>SELECT DATE_FORMAT(’2003-10-03’,GET_FORMAT(DATE,’EUR’));
-> ’03.10.2003’
mysql>SELECT STR_TO_DATE(’10.31.2003’,GET_FORMAT(DATE,’USA’));
-> ’2003-10-31’
HOUR(time)返回time对应的小时数。对于日时值的返回值范围是从0到23。
mysql>SELECT HOUR(’10:05:03’);
-> 10
然而, TIME值的范围实际上非常大,所以HOUR可以返回大于23的值。
mysql>SELECT HOUR(’272:59:59’);
-> 272
LAST_DAY(date)获取一个日期或日期时间值,返回该月最后一天对应的值。若参数无效,则返回NULL。
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
LOCALTIME, LOCALTIME()LOCALTIME及LOCALTIME()和NOW()具有相同意义。
LOCALTIMESTAMP, LOCALTIMESTAMP()LOCALTIMESTAMP和LOCALTIMESTAMP()和NOW()具有相同意义。
MAKEDATE(year,dayofyear)给出年份值和一年中的天数值,返回一个日期。dayofyear必须大于0,否则结果为NULL。
mysql>SELECT MAKEDATE(2001,31), MAKEDATE(2001,32);
-> ’2001-01-31’, ’2001-02-01’
mysql>SELECT MAKEDATE(2001,365), MAKEDATE(2004,365);
-> ’2001-12-31’, ’2004-12-30’
mysql>SELECT MAKEDATE(2001,0);
-> NULL
MAKETIME(hour,minute,second)返回由hour、minute和second参数计算得出的时间值。
mysql>SELECT MAKETIME(12,15,30);
-> ’12:15:30’
MICROSECOND(expr)从时间或日期时间表达式expr返回微秒值,其数字范围从0到999999。
mysql>SELECT MICROSECOND(’12:00:00.123456’);
-> 123456
mysql>SELECT MICROSECOND(’1997-12-31 23:59:59.000010’);
-> 10
MINUTE(time)返回time对应的分钟数,范围是从0到59。
mysql>SELECT MINUTE(’98-02-03 10:05:03’);
-> 5
MONTH(date)返回date对应的月份,范围时从1到12。
mysql>SELECT MONTH(’1998-02-03’);
-> 2
MONTHNAME(date)返回date对应月份的全名。
mysql>SELECT MONTHNAME(’1998-02-05’);
-> ’February ’
NOW()返回当前日期和时间值,其格式为’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS, 具体格式取决于该函数是否用在字符串中或数字语境中。
mysql>SELECT NOW();
-> ’1997-12-15 23:50:26’
mysql>SELECT NOW() + 0;
-> 19971215235026
在一个存储程序或触发器内, NOW()返回一个常数时间,该常数指示了该程序或触发语句开始执行的时间。这同SYSDATE()的运行有所不同。
PERIOD_ADD(P,N)添加N个月至周期P(格式为YYMM或YYYYMM),返回值的格式为YYYYMM。注意周期参数P不是日期值。
mysql>SELECT PERIOD_ADD(9801,2);
-> 199803
PERIOD_DIFF(P1,P2)返回周期P1和P2之间的月份数。P1和P2的格式应该为YYMM或YYYYMM。注意周期参数P1和P2不是日期值。
mysql>SELECT PERIOD_DIFF(9802,199703);
-> 11
QUARTER(date)返回date对应的一年中的季度值,范围是从1到4。
mysql>SELECT QUARTER(’98-04-01’);
-> 2
SECOND(time)返回time对应的秒数,范围是从0到59。
mysql>SELECT SECOND(’10:05:03’);
-> 3
SEC_TO_TIME(seconds)返回被转化为小时、 分钟和秒数的seconds参数值,其格式为’HH:MM:SS’或HHMMSS,具体格式根据该函数是否用在字符串或数字语境中而定。
mysql>SELECT SEC_TO_TIME(2378);
-> ’00:39:38’
mysql>SELECT SEC_TO_TIME(2378) + 0;
-> 3938
STR_TO_DATE(str,format)这是DATE_FORMAT()函数的倒转。它获取一个字符串str和一个格式字符串format。若格式字符串包含日期和时间部分,则STR_TO_DATE()返回一个DATETIME值, 若该字符串只包含日期部分或时间部分,则返回一个DATE或TIME值。
str所包含的日期、时间或日期时间值应该在format指示的格式中被给定。对于可用在format中的说明符,请参见DATE_FORMAT()函数说明表。 所有其它的字符被逐字获取,因此不会被解释。若str包含一个非法日期、时间或日期时间值,则STR_TO_DATE()返回NULL。同时,一个非法值会引起警告。
其意义是,例如,只要具体日期部分的范围时从1到31之间,则允许一个日期中的具体日期部分大于一个月中天数值。并且,允许“零”日期或带有0值部分的日期。
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’
SUBDATE(date,INTERVALexprtype) SUBDATE(expr,days)当被第二个参数的INTERVAL型式调用时, SUBDATE()和DATE_SUB()的意义相同。对于有关INTERVAL参数的信息, 见有关DATE_ADD()的讨论。
mysql>SELECT DATE_SUB(’1998-01-02’, INTERVAL 31 DAY);
-> ’1997-12-02’
mysql>SELECT SUBDATE(’1998-01-02’, INTERVAL 31 DAY);
-> ’1997-12-02’
第二个形式允许对days使用整数值。在这些情况下,它被算作由日期或日期时间表达式expr中提取的天数。
mysql>SELECT SUBDATE(’1998-01-02 12:00:00’, 31);
-> ’1997-12-02 12:00:00’
注意不能使用格式'%X%V'来将一个year-week字符串转化为一个日期,原因是当一个星期跨越一个月份界限时,一个年和星期的组合不能标示一个唯一的年和月份。若要将year-week转化为一个日期,则也应指定具体工作日:
mysql>select str_to_date(’200442 Monday’, ’%X%V %W’);
-> 2004-10-18
SUBTIME(expr,expr2)SUBTIME()从expr中提取expr2,然后返回结果。expr是一个时间或日期时间表达式,而xpr2是一个时间表达式。
mysql>SELECT SUBTIME(’1997-12-31 23:59:59.999999’,’1 1:1:1.000002’);
-> ’1997-12-30 22:58:58.999997’
mysql>SELECT SUBTIME(’01:00:00.999999’, ’02:00:00.999998’);
-> ’-00:59:59.999999’
SYSDATE()返回当前日期和时间值,格式为’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS, 具体格式根据函数是否用在字符串或数字语境而定。
在一个存储程序或触发器中, SYSDATE()返回其执行的时间,而非存储成都或触发语句开始执行的时间。这个NOW()的运作有所不同。
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’
TIMEDIFF(expr,expr2)TIMEDIFF()返回起始时间expr和结束时间expr2之间的时间。expr和expr2为时间或date-and-time表达式,两个的类型必须一样。
mysql>SELECT TIMEDIFF(’2000:01:01 00:00:00’,
->’2000:01:01 00:00:00.000001’);
-> ’-00:00:00.000001’
mysql>SELECT TIMEDIFF(’1997-12-31 23:59:59.000001’,
->’1997-12-30 01:01:01.000002’);
-> ’46:58:57.999999’
TIMESTAMP(expr) , TIMESTAMP(expr,expr2)对于一个单参数,该函数将日期或日期时间表达式expr作为日期时间值返回.对于两个参数,它将时间表达式expr2添加到日期或日期时间表达式expr中,将theresult作为日期时间值返回。
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’
TIMESTAMPADD(interval,int_expr,datetime_expr)将整型表达式int_expr添加到日期或日期时间表达式datetime_expr中。int_expr的单位被时间间隔参数给定,该参数必须是以下值的其中一个:FRAC_SECOND、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER或YEAR。
可使用所显示的关键词指定Interval值,或使用SQL_TSI_前缀。例如, DAY或SQL_TSI_DAY都是正确的。
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’
TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)返回日期或日期时间表达式datetime_expr1和datetime_expr2the之间的整数差。其结果的单位由interval参数给出。interval的法定值同TIMESTAMPADD()函数说明中所列出的相同。
mysql>SELECT TIMESTAMPDIFF(MONTH,’2003-02-01’,’2003-05-01’);
-> 3
mysql>SELECT TIMESTAMPDIFF(YEAR,’2002-05-01’,’2001-01-01’);
-> -1
TIME_FORMAT(time,format)其使用和DATE_FORMAT()函数相同,然而format字符串可能仅会包含处理小时、分钟和秒的格式说明符。其它说明符产生一个NULL值或0。
若timevalue包含一个大于23的小时部分,则%H和%k小时格式说明符会产生一个大于0..23的通常范围的值。另一个小时格式说明符产生小时值模数12。
mysql>SELECT TIME_FORMAT(’100:00:00’, ’%H %k %h %I %l’);
-> ’100 100 04 04 4’
TIME_TO_SEC(time)返回已转化为秒的time参数。
mysql>SELECT TIME_TO_SEC(’22:23:00’);
-> 80580
mysql>SELECT TIME_TO_SEC(’00:39:38’);
-> 2378
TO_DAYS(date)给定一个日期date,返回一个天数(从年份0开始的天数)。
mysql>SELECT TO_DAYS(950501);
-> 728779
mysql>SELECT TO_DAYS(’1997-10-07’);
-> 729669
TO_DAYS()不用于阳历出现(1582)前的值,原因是当日历改变时,遗失的日期不会被考虑在内。
请记住,MySQL使用“日期和时间类型”中的规则将日期中的二位数年份值转化为四位。例如, ’1997-10-07’和’97-10-07’被视为同样的日期:
mysql>SELECT TO_DAYS(’1997-10-07’), TO_DAYS(’97-10-07’);
-> 729669, 729669
对于1582年之前的日期(或许在其它地区为下一年),该函数的结果实不可靠的。
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)若无参数调用,则返回一个Unix timestamp (’1970-01-01 00:00:00’ GMT之后的秒数)作为无符号整数。若用date来调用UNIX_TIMESTAMP(),它会将参数值以’1970-01-01 00:00:00’ GMT后的秒数的形式返回。date可以是一个DATE字符串、一个DATETIME字符串、一个TIMESTAMP或一个当地时间的YYMMDD或YYYMMDD格式的数字。
mysql>SELECT UNIX_TIMESTAMP();
-> 882226357
mysql>SELECT UNIX_TIMESTAMP(’1997-10-04 22:23:00’);
-> 875996580
当UNIX_TIMESTAMP被用在TIMESTAMP列时,函数直接返回内部时戳值,而不进行任何隐含的 “string-to-Unix-timestamp”转化。假如你向UNIX_TIMESTAMP()传递一个溢出日期,它会返回0,但请注意只有基本范围检查会被履行(年份从1970到2037, 月份从01到12,日期从 01到31)。
假如你想要减去UNIX_TIMESTAMP()列,你或许希望删去带符号整数的结果。
UTC_DATE, UTC_DATE()返回当前UTC日期值,其格式为’YYYY-MM-DD’或YYYYMMDD,具体格式取决于函数是否用在字符串或数字语境中。
mysql>SELECT UTC_DATE(), UTC_DATE() + 0;
-> ’2003-08-14’, 20030814
UTC_TIME, UTC_TIME()返回当前UTC值,其格式为 ’HH:MM:SS’或HHMMSS,具体格式根据该函数是否用在字符串或数字语境而定。
mysql>SELECT UTC_TIME(), UTC_TIME() + 0;
-> ’18:07:53’, 180753
UTC_TIMESTAMP, UTC_TIMESTAMP()返回当前UTC日期及时间值,格式为’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS,具体格式根据该函数是否用在字符串或数字语境而定。
mysql>SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
-> ’2003-08-14 18:08:04’, 20030814180804
WEEK(date[,mode])该函数返回date对应的星期数。WEEK()的双参数形式允许你指定该星期是否起始于周日或周一, 以及返回值的范围是否为从0到53或从1到53。若mode参数被省略,则使用default_week_format系统自变量的值。
以下表说明了mode参数的工作过程:d
第一天Mode工作日范围Week 1为第一周...0周日0-53本年度中有一个周日1周一0-53本年度中有3天以上2周日1-53本年度中有一个周日3周一1-53本年度中有3天以上4周日0-53本年度中有3天以上5周一0-53本年度中有一个周一6周日1-53本年度中有3天以上7周一1-53本年度中有一个周一mysql>SELECT WEEK(’1998-02-20’);
-> 7
mysql>SELECT WEEK(’1998-02-20’,0);
-> 7
mysql>SELECT WEEK(’1998-02-20’,1);
-> 8
mysql>SELECT WEEK(’1998-12-31’,1);
-> 53
注意,假如有一个日期位于前一年的最后一周, 若你不使用2、3、6或7作为mode参数选择,则MySQL返回0:
mysql>SELECT YEAR(’2000-01-01’), WEEK(’2000-01-01’,0);
-> 2000, 0
有人或许会提出意见,认为MySQL对于WEEK()函数应该返回52,原因是给定的日期实际上发生在1999年的第52周。我们决定返回0作为代替的原因是我们希望该函数能返回“给定年份的星期数”。这使得WEEK()函数在同其它从日期中抽取日期部分的函数结合时的使用更加可靠。
假如你更希望所计算的关于年份的结果包括给定日期所在周的第一天,则应使用0、2、5或7作为mode参数选择。
mysql>SELECT WEEK(’2000-01-01’,2);
-> 52
作为选择,可使用YEARWEEK()函数:
mysql>SELECT YEARWEEK(’2000-01-01’);
-> 199952
mysql>SELECT MID(YEARWEEK(’2000-01-01’),5,2);
-> ’52’
WEEKDAY(date)返回date(0 =周一, 1 =周二, ... 6 =周日)对应的工作日索引 weekday index for
mysql>SELECT WEEKDAY(’1998-02-03 22:23:00’);
-> 1
mysql>SELECT WEEKDAY(’1997-11-05’);
-> 2
WEEKOFYEAR(date)将该日期的阳历周以数字形式返回,范围是从1到53。它是一个兼容度函数,相当于WEEK(date,3)。
mysql>SELECT WEEKOFYEAR(’1998-02-20’);
-> 8
YEAR(date)返回date对应的年份,范围是从1000到9999。
mysql>SELECT YEAR(’98-02-03’);
-> 1998
YEARWEEK(date), YEARWEEK(date,start)返回一个日期对应的年或周。start参数的工作同start参数对WEEK()的工作相同。结果中的年份可以和该年的第一周和最后一周对应的日期参数有所不同。
mysql>SELECT YEARWEEK(’1987-01-01’);
-> 198653
注意,周数和WEEK()函数队可选参数0或1可能会返回的(0) w有所不同,原因是此时WEEK()返回给定年份的语境中的周。
-> ’1997-10-07’
相关文章: