MySQL内置函数中的日期和时间函数详解.docx
《MySQL内置函数中的日期和时间函数详解.docx》由会员分享,可在线阅读,更多相关《MySQL内置函数中的日期和时间函数详解.docx(20页珍藏版)》请在冰豆网上搜索。
MySQL内置函数中的日期和时间函数详解
MySQL内置函数中的日期和时间函数详解
下面的例子使用了时间函数。
以下询问选择了最近的30天内所有带有date_col值的记录:
mysql>SELECTsomethingFROMtbl_name
->WHEREDATE_SUB(CURDATE(),INTERVAL30DAY)<=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>SELECTDATE_ADD('1998-01-02',INTERVAL31DAY);
->'1998-02-02'
mysql>SELECTADDDATE('1998-01-02',INTERVAL31DAY);
->'1998-02-02'
若days参数只是整数值,则MySQL5.1将其作为天数值添加至expr。
mysql>SELECTADDDATE('1998-01-02',31);
->'1998-02-02'
◆ADDTIME(expr,expr2)
ADDTIME()将expr2添加至expr然后返回结果。
expr是一个时间或时间日期表达式,而expr2是一个时间表达式。
mysql>SELECTADDTIME('1997-12-3123:
59:
59.999999',
-> '11:
1:
1.000002');
->'1998-01-0201:
01:
01.000001'
mysql>SELECTADDTIME('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给出的时区,然后返回结果值。
在从若from_tz到UTC的转化过程中,该值超出TIMESTAMP类型的被支持范围,那么转化不会发生。
mysql>SELECTCONVERT_TZ('2004-01-0112:
00:
00','GMT','MET');
->'2004-01-0113:
00:
00'
mysql>SELECTCONVERT_TZ('2004-01-0112:
00:
00','+00:
00','+10:
00');
->'2004-01-0122:
00:
00'
注释:
若要使用诸如'MET'或'Europe/Moscow'之类的指定时间区,首先要设置正确的时区表。
◆CURDATE()
将当前日期按照'YYYY-MM-DD'或YYYYMMDD格式的值返回,具体格式根据函数用在字符串或是数字语境中而定。
mysql>SELECTCURDATE();
->'1997-12-15'
mysql>SELECTCURDATE()+0;
->19971215
◆CURRENT_DATECURRENT_DATE()
CURRENT_DATE和CURRENT_DATE()是的同义词.
◆CURTIME()
将当前时间以'HH:
MM:
SS'或HHMMSS的格式返回,具体格式根据函数用在字符串或是数字语境中而定。
mysql>SELECTCURTIME();
->'23:
50:
26'
mysql>SELECTCURTIME()+0;
->235026
◆CURRENT_TIME,CURRENT_TIME()
CURRENT_TIME和CURRENT_TIME()是CURTIME()的同义词。
◆CURRENT_TIMESTAMP,CURRENT_TIMESTAMP()
CURRENT_TIMESTAMP和CURRENT_TIMESTAMP()是NOW()的同义词。
◆DATE(expr)
提取日期或时间日期表达式expr中的日期部分。
mysql>SELECTDATE('2003-12-3101:
02:
03');
->'2003-12-31'
◆DATEDIFF(expr,expr2)
DATEDIFF()返回起始时间expr和结束时间expr2之间的天数。
Expr和expr2为日期或date-and-time表达式。
计算中只用到这些值的日期部分。
mysql>SELECTDATEDIFF('1997-12-3123:
59:
59','1997-12-30');
->1
mysql>SELECTDATEDIFF('1997-11-3023:
59:
59','1997-12-31');
->-31
◆DATE_ADD(date,INTERVALexprtype)DATE_SUB(date,INTERVALexprtype)
这些函数执行日期运算。
date是一个DATETIME或DATE值,用来指定起始时间。
expr是一个表达式,用来指定从起始日期添加或减去的时间间隔值。
Expr是一个字符串;对于负值的时间间隔,它可以以一个‘-’开头。
type为关键词,它指示了表达式被解释的方式。
关键词INTERVA及type分类符均不区分大小写。
以下表显示了type和expr参数的关系:
MySQL允许任何expr格式中的标点分隔符。
表中所显示的是建议的分隔符。
若date参数是一个DATE值,而你的计算只会包括YEAR、MONTH和DAY部分(即,没有时间部分),其结果是一个DATE值。
否则,结果将是一个DATETIME值。
若位于另一端的表达式是一个日期或日期时间值,则INTERVALexprtype只允许在+操作符的两端。
对于–操作符, INTERVALexprtype只允许在其右端,原因是从一个时间间隔中提取一个日期或日期时间值是毫无意义的。
(见下面的例子)。
mysql>SELECT'1997-12-3123:
59:
59'+INTERVAL1SECOND;
->'1998-01-0100:
00:
00'
mysql>SELECTINTERVAL1DAY+'1997-12-31';
->'1998-01-01'
mysql>SELECT'1998-01-01'-INTERVAL1SECOND;
->'1997-12-3123:
59:
59'
mysql>SELECTDATE_ADD('1997-12-3123:
59:
59',
-> INTERVAL1SECOND);
->'1998-01-0100:
00:
00'
mysql>SELECTDATE_ADD('1997-12-3123:
59:
59',
-> INTERVAL1DAY);
->'1998-01-0123:
59:
59'
mysql>SELECTDATE_ADD('1997-12-3123:
59:
59',
-> INTERVAL'1:
1'MINUTE_SECOND);
->'1998-01-0100:
01:
00'
mysql>SELECTDATE_SUB('1998-01-0100:
00:
00',
-> INTERVAL'11:
1:
1'DAY_SECOND);
->'1997-12-3022:
58:
59'
mysql>SELECTDATE_ADD('1998-01-0100:
00:
00',
-> INTERVAL'-110'DAY_HOUR);
->'1997-12-3014:
00:
00'
mysql>SELECTDATE_SUB('1998-01-02',INTERVAL31DAY);
->'1997-12-02'
mysql>SELECTDATE_ADD('1992-12-3123:
59:
59.000002',
-> INTERVAL'1.999999'SECOND_MICROSECOND);
->'1993-01-0100:
00:
01.000001'
若你指定了一个过于短的时间间隔值(不包括type关键词所预期的所有时间间隔部分),MySQL假定你已经省去了时间间隔值的最左部分。
例如,你指定了一种类型的DAY_SECOND,expr的值预期应当具有天、小时、分钟和秒部分。
若你指定了一个类似'1:
10'的值,MySQL假定天和小时部分不存在,那么这个值代表分和秒。
换言之,'1:
10'DAY_SECOND被解释为相当于'1:
10'MINUTE_SECOND。
这相当于MySQL将TIME值解释为所耗费的时间而不是日时的解释方式。
假如你对一个日期值添加或减去一些含有时间部分的内容,则结果自动转化为一个日期时间值:
mysql>SELECTDATE_ADD('1999-01-01',INTERVAL1DAY);
->'1999-01-02'
mysql>SELECTDATE_ADD('1999-01-01',INTERVAL1HOUR);
->'1999-01-0101:
00:
00'
假如你使用了格式严重错误的日期,则结果为NULL。
假如你添加了 MONTH、YEAR_MONTH或YEAR,而结果日期中有一天的日期大于添加的月份的日期最大限度,则这个日期自动被调整为添加月份的最大日期:
mysql>SELECTDATE_ADD('1998-01-30',INTERVAL1MONTH);
->'1998-02-28'
◆DATE