MySQL 的 时间/日期 计算总结 收藏
2009年11月28日





·取当前时间的函数:
NOW()、LOCALTIME、LOCALTIME(),LOCALTIMESTAMP,

LOCALTIMESTAMP()
CURDATE()、 CURTIME()、 UTC_DATE()、 CURRENT_DATE()、
UTC_TIME()、UTC_TIMESTAMP()、CURRENT_TIMESTAMP()、

CURRENT_TIME()、
FROM_UNIXTIME()、
CONVERT_TZ()、DAY()


·时间、日期计算函数:
DATE_ADD(), DATE_SUB(),ADDDATE(),SUBDATE,

CURRENT_DATE(),CURRENT_TIME(),CURDATE(),CURTIME()
DATEDIFF(expr,expr2)
TIMEDIFF(expr,expr2)
ADDTIME(),SUBTIME()
CURDATE(), CURTIME()
LOCALTIMESTAMP, LOCALTIMESTAMP()

TIMESTAMP(expr) , TIMESTAMP(expr,expr2) ,
TIMESTAMPADD(interval,int_expr,datetime_expr)
TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)

·时间、日期抽取函数:
EXTRACT(),
TIME(expr)
DAY(), DAYNAME(), DAYOFMONTH(), DAYOFWEEK(), DAYOFWEEK

(),
WEEK(date[,mode]) ,WEEKDAY(date),
DAYOFYEAR(date), MONTH(date), MONTHNAME(date),QUARTER

(date)
MICROSECOND(expr),MINUTE(),SECOND(),HOUR(time),
MAKEDATE(year,dayofyear) MAKETIME(hour,minute,second)
YEAR(date)
FROM_DAYS(), TO_DAYS(), LAST_DAY(date)
DATE_FORMAT(date,format), STR_TO_DATE(str,format)
TIME_FORMAT(time,format)
TIME_TO_SEC(time) TO_DAYS(date)
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)
UTC_TIMESTAMP, UTC_TIMESTAMP()
UTC_DATE, UTC_DATE()


·INTERVAL 关键字(重点!!!)
========================================================

==============
type 值            预期的 expr 格式
========================================================

==============
MICROSECOND         MICROSECONDS
-------------------------------------------------------

---------------
SECOND              SECONDS
-------------------------------------------------------

---------------
MINUTE              MINUTES
-------------------------------------------------------

---------------
HOUR                HOURS
-------------------------------------------------------

---------------
DAY                 DAYS
-------------------------------------------------------

---------------
WEEK                WEEKS
-------------------------------------------------------

---------------
MONTH               MONTHS
-------------------------------------------------------

---------------
QUARTER             QUARTERS
-------------------------------------------------------

---------------
YEAR                YEARS
-------------------------------------------------------

---------------
SECOND_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'
========================================================

==============
    ·详尽范例:
    SELECT NOW() + INTERVAL  3 DAY
    SELECT NOW() + INTERVAL -3 DAY
    SELECT NOW() - INTERVAL +3 DAY

    ·MICROSECOND
    SELECT NOW(), NOW()+INTERVAL 1 MICROSECOND
    ==> 2007-04-20 14:35:04.0  2007-04-20

14:35:04.000000001

    ·SECOND
    SELECT NOW(), NOW()+INTERVAL 1 SECOND
    ==> 2007-04-20 14:38:40.0  2007-04-20 14:38:41.0

    ·MINUTE
    SELECT NOW(), NOW()+INTERVAL 1 MINUTE
    ==> 2007-04-20 14:38:40.0  2007-04-20 14:38:41.0

    ·HOUR
    SELECT NOW(), NOW()+INTERVAL 1 HOUR
    ==> 2007-04-20 14:41:23.0  2007-04-20 15:41:23.0

    ·DAY
    SELECT NOW(), NOW()+INTERVAL 1 DAY
    ==> 2007-04-20 14:42:04.0  2007-04-21 14:42:04.0




·EXTRACT(type FROM date) (重点!!!)
    ·说明:
    EXTRACT()函数所使用的时间间隔类型说明符同 DATE_ADD()

或DATE_SUB()
    的相同,但它从日期中提取其部分,而不是执行日期运算。
   
    ·范例:
    SELECT NOW(), EXTRACT(YEAR FROM NOW())  
    ==> 2007-04-20 15:06:46.0  2007
   
    SELECT NOW(), EXTRACT(MONTH FROM NOW())
    ==> 2007-04-20 15:08:24.0  4
   
    SELECT NOW(), EXTRACT(DAY FROM NOW())
    ==> 2007-04-20 15:07:31.0  20




·DATE_ADD(date, INERVAL expr type) DATE_SUB(date,

INERVAL expr type)
    ·说明:参数date 只取日期部分。零值日期 返回 0,

如'2007-04-00'。
    激活 INTERVAL 后,DATE_ADD等价于 ADDDATE(),DATE_SUB

等价于SUB_DATE()
     
    ·范例:
    SELECT NOW(), DATE_ADD(CURDATE(),INTERVAL 3 DAY)
    SELECT NOW(), DATE_SUB(CURDATE(),INTERVAL 3 DAY)

    SELECT NOW(), ADDDATE(CURDATE(),INTERVAL 3 DAY)
    SELECT NOW(), SUBDATE(CURDATE(),INTERVAL 3 DAY)

    SELECT NOW(), ADDDATE(CURDATE(), 3)
    SELECT NOW(), SUBDATE(CURDATE(), 3)

·CONVERT_TZ()
    ·说明:将时间日期值dt 从from_tz 给出的时区转到to_tz

给出的时区,
    然后返回结果值。若自变量无效,则这个函数会返回 NULL


    ·范例:
    SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET')
    SELECT CONVERT_TZ('2004-01-01

12:00:00','+00:00','+10:00')


·ADDTIME(expr,expr2)
    ·说明:ADDTIME()将 expr2添加至expr 然后返回结果。
    expr 是一个时间或时间日期表达式,而expr2 是一个时间

表达式。
    ·范例:
    SELECT ADDTIME('1997-12-31 23:59:59.999999', '1

1:1:1.000002')
    SELECT ADDTIME('01:00:00.999999', '02:00:00.999998')


·SUBTIME(expr,expr2)
    SUBTIME()从expr 中提取expr2 ,然后返回结果。expr 是

一个时间或日期
    时间表达式,而xpr2 是一个时间表达式。
    SELECT NOW(), SUBTIME(NOW(), '1 1:1:1.000002')
    ==> 2007-04-20 16:00:35.0  2007-04-19

14:59:33.000999998


·CURDATE(), CURTIME(),CURRENT_DATE(),CURRENT_TIME()
    ·说明:
    CURDATE()将当前日期按照'YYYY-MM-DD' 或YYYYMMDD 格式

的值返回,
    CURTIME()将当前时间以'HH:MM:SS'或 HHMMSS 的格式返回


    具体格式根据函数用在字符串或是数字语境中而定。
    CURDATE()等价于CURRENT_DATE()
    CURTIME()等价于CURRENT_TIME()

    ·范例:
    SELECT CURDATE()                ==>  2007-4-20
    SELECT CURDATE()+0              ==>  20070420
   
    SELECT CURRENT_TIME()           ==> 03:59:28
    SELECT CURRENT_TIME()+0         ==> 035928

·DATE(expr)
    ·说明:提取日期或时间日期表达式expr中的日期部分。
   
    ·范例:
    SELECT DATE('2007-04-20 01:02:03')  ==> 2007-04-20
    SELECT NOW(), DATE(NOW())    ==> 2007-04-20

04:03:30.0 2007-4-20

·DATEDIFF(expr,expr2)
    ·说明:返回起始时间 expr和结束时间expr2之间的天数。
    Expr和expr2 为日期或 date-and-time 表达式。
    计算中只用到这些值的日期部分。

    ·范例:
    SELECT NOW(), DATEDIFF(NOW(),'2007-04-01')      
    ==> 2007-04-20 14:25:33.0 19
    SELECT NOW(), DATEDIFF('2007-04-01', NOW())     
    ==> 2007-04-20 14:25:33.0  -19

·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'的不完全日期.

    ·%Y-%m-%d %H:%i:%S.%f 为最常用的格式
    SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%S.%f')

·TIME_FORMAT(time,format)
    同 DATE_FORMAT()

·STR_TO_DATE(str,format)
    这是DATE_FORMAT() 函数的倒转。

·DAY(date)
    DAY() 和DAYOFMONTH()的意义相同。
    SELECT NOW() ,DAY(NOW())            ==> 2007-04-20

14:58:37.0  20

·DAYNAME(date)
    返回date 对应的工作日名称。
    SELECT NOW() ,DAYNAME(NOW())        ==> 2007-04-20

14:58:05.0  Friday

·DAYOFMONTH(date)
    返回date 对应的该月日期,范围是从 1到31。与DAY()意义

相同。
    SELECT NOW() ,DAYOFMONTH(NOW())     ==> 2007-04-20

15:00:53.0  20

·DAYOFWEEK(date)
    返回date (1 = 周日, 2 = 周一, ..., 7 = 周六)对应的工

作日索引。
    这些索引值符合 ODBC标准
    SELECT NOW() ,DAYOFWEEK(NOW())      ==> 2007-04-20

15:01:24.0  6

·DAYOFYEAR(date)
    返回date 对应的一年中的天数,范围是从 1到366。
    参考 MAKEDATE(year,dayofyear)
    SELECT NOW() ,DAYOFYEAR(NOW())      ==> 2007-04-20

15:02:53.0  110

·HOUR(time)
    返回time 对应的小时数。对于日时值的返回值范围是从 0

到 23 。

·LAST_DAY(date)
    获取一个日期或日期时间值,返回该月最后一天对应的值。
    若参数无效,则返回NULL。

·MAKEDATE(year,dayofyear)
    给出年份值和一年中的天数值,返回一个日期。
    dayofyear 必须大于 0 ,否则结果为 NULL。
    参考DAYOFYEAR(date)
    SELECT NOW(), MAKEDATE(YEAR(NOW()),DAYOFYEAR(NOW()))
    ==> 2007-04-20 15:47:03.0  2007-04-20

·MAKETIME(hour,minute,second)
    返回由hour、 minute和second 参数计算得出的时间值。
    参考:HOUR(),MINUTE(),SECOND()


·FROM_DAYS()
·TO_DAYS()
    SELECT FROM_DAYS(TO_DAYS(NOW()))    ==> 2007-04-20


·MICROSECOND(expr)
    ·从时间或日期时间表达式expr返回微秒值,其数字范围从

0到 999999。
    SELECT MICROSECOND('12:00:00.123456')       ==>

123456

·MINUTE(time)
    返回 time 对应的分钟数,范围是从 0 到 59。

·MONTH(date)
    返回date 对应的月份,范围时从 1 到 12。

·MONTHNAME(date)
    返回date 对应月份的全名。

·QUARTER(date)
    返回date 对应的一年中的季度值,范围是从 1到 4。

·SYSDATE()
    返回当前日期和时间值,格式为'YYYY-MM-DD HH:MM:SS' 或

YYYYMMDDHHMMSS,
    具体格式根据函数是否用在字符串或数字语境而定。
    在一个存储程序或触发器中, SYSDATE()返回其执行的时间,

而非存储成都
    或触发语句开始执行的时间。这个NOW()的运作有所不同。


·TIME(expr)
    提取一个时间或日期时间表达式的时间部分,并将其以字符

串形式返回。
    SELECT NOW(), TIME(NOW())
    ==> 2007-04-20 16:03:30.0  16:03:30


·TIMEDIFF(expr,expr2)
    TIMEDIFF() 返回起始时间 expr 和结束时间expr2 之间的

时间。
    expr 和expr2 为时间或 date-and-time 表达式,两个的类

型必须一样。  


·TIMESTAMP(expr) , TIMESTAMP(expr,expr2)
    对于一个单参数,该函数将日期或日期时间表达式 expr 作

为日期时间值返回.
    对于两个参数, 它将时间表达式 expr2 添加到日期或日期

时间表达式 expr 中,
    将theresult作为日期时间值返回。
   
    SELECT TIMESTAMP('2007-04-20')
    ==> 2007-04-20 00:00:00.0
   
    SELECT TIMESTAMP('2007-04-20 12:00:00','12:00:00')
    ==> 2007-04-21 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。

    SELECT TIMESTAMPADD(MINUTE,1,'2007-04-20 12:00:00')
    ==> 2007-04-20 12:01:00

·TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)
    返回日期或日期时间表达式datetime_expr1 和

datetime_expr2the
    之间的整数差。其结果的单位由interval 参数给出。

interval 的法
    定值同TIMESTAMPADD()函数说明中所列出的相同。

    SELECT TIMESTAMPDIFF(MONTH,'2007-04-20','2003-05-

01')
    ==> -47

    SELECT TIMESTAMPDIFF(YEAR,'2001-01-01','2007-04-20')
    ==> 6

·TIME_TO_SEC(time)
    返回已转化为秒的time参数。

·TO_DAYS(date)
    给定一个日期date, 返回一个天数 (从年份0开始的天数 )



·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格式的数字。
   
    SELECT NOW(), UNIX_TIMESTAMP(), UNIX_TIMESTAMP(NOW

())
    ==> 2007-04-20 16:27:24.0  1177057644           

1177057644

·UTC_DATE, UTC_DATE()
    返回当前 UTC日期值,其格式为 'YYYY-MM-DD' 或

YYYYMMDD,
具体格式取决于函数是否用在字符串或数字语境中。
   
    SELECT UTC_DATE(), UTC_DATE() + 0
    ==> 2007-04-20     20070420

·UTC_TIMESTAMP, UTC_TIMESTAMP()
    返回当前UTC日期及时间值,格式为 'YYYY-MM-DD

HH:MM:SS' 或YYYYMMDDHHMMSS,
具体格式根据该函数是否用在字符串或数字语境而定。
   
    SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0
    ==> 2007-04-20 08:30:05.0  20070420083005


·WEEK(date[,mode])
        第一天                 
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        本年度中有一个周一

·WEEKDAY(date)
    返回date (0 = 周一, 1 = 周二, ... 6 = 周日)对应的工

作日索引
    weekday index for
   
    SELECT WEEKDAY(NOW())       ==> 4

·WEEKOFYEAR(date)
    将该日期的阳历周以数字形式返回,范围是从1到53。
它是一个兼容度函数,相当于WEEK(date,3)。

·YEAR(date)
    返回date 对应的年份,范围是从1000到9999。

·YEARWEEK(date), YEARWEEK(date,start)
    返回一个日期对应的年或周。start参数的工作同 start参

数对 WEEK()的工作相同。
结果中的年份可以和该年的第一周和最后一周对应的日期参数有

所不同。
   
    SELECT YEARWEEK('2007-01-01')
    ==> 200653

    注意,周数和WEEK()函数队可选参数0或 1可能会返回的(0)

w有所不同,
原因是此时 WEEK() 返回给定年份的语境中的周。

 

本文永久链接: http://www.zzxj.net/blog/fxs_2008/archive/2009/11/28/98.html

发表于 @ 2009年11月28日 |评论(loading... )|收藏

发表评论 姓  名: