首頁 > 資料庫 > mysql教程 > MySQL基礎教學9 — 函數之日期與時間函數

MySQL基礎教學9 — 函數之日期與時間函數

黄舟
發布: 2017-02-24 11:41:20
原創
959 人瀏覽過

下面的範例使用了時間函數。以下詢問選擇了最近的 30天內所有帶有date_col 值的記錄:

mysql> SELECT something FROM tbl_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,INTERVAL expr type) ADDDATE(expr,days) ATE_ADD( )的同義詞。相關函數SUBDATE() 則是DATE_SUB()的同義字。關於INTERVAL參數上的資訊 ,請參閱關於DATE_ADD()的論述。

    mysql> SELECT DATE_ADD(&#39;1998-01-02&#39;, INTERVAL 31 DAY);
    -> &#39;1998-02-02&#39;
    mysql> SELECT ADDDATE(&#39;1998-01-02&#39;, INTERVAL 31 DAY);
    -> &#39;1998-02-02&#39;
    若 days 参数只是整数值,则 MySQL 5.1将其作为天数值添加至 expr。
    mysql> SELECT ADDDATE(&#39;1998-01-02&#39;, 31);
    -> &#39;1998-02-02&#39;
    登入後複製

ADDTIME(

expr
    ,
  • expr2

    )ADDTIME()將 

    exp2
  •  
expr

 是一個時間或時間日期表達式,而expr2 是一個時間表達式。

mysql> SELECT ADDTIME(&#39;1997-12-31 23:59:59.999999&#39;,
->                &#39;1 1:1:1.000002&#39;);
-> &#39;1998-01-02 01:01:01.000001&#39;
mysql> SELECT ADDTIME(&#39;01:00:00.999999&#39;, &#39;02:00:00.999998&#39;);
-> &#39;03:00:01.999997&#39;
登入後複製
CONVERT_TZ(dt,

from_tz
    ,
  • to_tz

    )CONVERT_tz)

_f5_TZ(5)。

to_tz給出的時區,然後傳回結果值。若自變數無效,則這個函數會回傳 NULL。 在從若from_tz 到UTC的轉化過程中,該值超出 TIMESTAMP 類型的被支持範圍,那麼轉化不會發生。

mysql> SELECT CONVERT_TZ(&#39;2004-01-01 12:00:00&#39;,&#39;GMT&#39;,&#39;MET&#39;);
-> &#39;2004-01-01 13:00:00&#39;
mysql> SELECT CONVERT_TZ(&#39;2004-01-01 12:00:00&#39;,&#39;+00:00&#39;,&#39;+10:00&#39;);
-> &#39;2004-01-01 22:00:00&#39;
登入後複製

註解:若要使用諸如 'MET'或 'Europe/Moscow'之類的指定時間區,首先要設定正確的時區表。

CURDATE()

  • 將當前日期按照'YYYY-MM-DD' 或YYYYMMDD 格式的值返回,具體格式根據函數用在字符串或是數字語境中而定。

    mysql> SELECT CURDATE();
    -> &#39;1997-12-15&#39;
    mysql> SELECT CURDATE() + 0;
    -> 19971215
    登入後複製

CURRENT_DATE CURRENT_DATE()

  • CURRENT_DATE和CURRENT_DATE()是的同義字.

    :
  • :H HHMMSS 的格式返回,具體格式根據函數用在字串或是數字語境中而定。
mysql> SELECT CURTIME();
-> &#39;23:50:26&#39;
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(&#39;2003-12-31 01:02:03&#39;);
    -> &#39;2003-12-31&#39;
    登入後複製

    DATEDIFF(

    expr
  • ,
expr2

)

    DATEDIFF() 返回起始時間
  • expr

    Exprexpr2 為日期或 date-and-time 表達式。計算中只用到這些數值的日期部分。

    mysql> SELECT DATEDIFF(&#39;1997-12-31 23:59:59&#39;,&#39;1997-12-30&#39;);
    -> 1
    mysql> SELECT DATEDIFF(&#39;1997-11-30 23:59:59&#39;,&#39;1997-12-31&#39;);
    -> -31
    登入後複製

DATE_ADD(date,INTERVAL expr type) DATE_SUB( 這些函數執行日期運算。 date

 是一個 DATETIME 或DATE值,用來指定起始時間。 
    expr
  •  是一個表達式,用來指定從起始日期添加或減去的時間間隔值。  

    Expr是一個字串;對於負值的時間間隔,它可以以一個 ‘-’開頭。 type 為關鍵字,它指示了表達式被解釋的方式。 關鍵字INTERVA及 type 分類符皆不區分大小寫。

    以下表顯示了type 和expr 參數的關係:

    SECONDSMINUTES33S WEEKMONTHQUARTER YEARSECOND_MICROSECOND .MICROSECONDS'MINUTE_SECOND'MINUTES:SECONDS'HOUR_MICROSECOND'HOURS.MICROSECONDS'HOUR_SECOND'HOURS:MINUTES:SECONDS'DAY_MICROSECONDDAY_SECONDDAY_MINUTE_H 'YEARS-MONTHS'
    type  MICROSECONDMICROSECONDS SECOND
    MINUTE
    HOUR
    HOUR
    WEEKS
    MONTHS
    QUARTERS
    YEARS
    'SECONDS.ROMICCONDSCOND_MICROSECOND
    :H
    'DAYS.MICROSECONDS'
    'DAYS HOURS:MINUTES:SECONDS'
    'DAYS HOURS:MINUTES'YEAR_MONTH

    MySQL 允许任何expr 格式中的标点分隔符。表中所显示的是建议的 分隔符。若 date 参数是一个 DATE 值,而你的计算只会包括 YEAR、MONTH和DAY部分(即, 没有时间部分), 其结果是一个DATE 值。否则,结果将是一个 DATETIME值。

    若位于另一端的表达式是一个日期或日期时间值 , 则INTERVAL expr type只允许在 + 操作符的两端。对于 –操作符, INTERVAL expr type 只允许在其右端,原因是从一个时间间隔中提取一个日期或日期时间值是毫无意义的。 (见下面的例子)。

    mysql> SELECT &#39;1997-12-31 23:59:59&#39; + INTERVAL 1 SECOND;
    -> &#39;1998-01-01 00:00:00&#39;
    mysql> SELECT INTERVAL 1 DAY + &#39;1997-12-31&#39;;
    -> &#39;1998-01-01&#39;
    mysql> SELECT &#39;1998-01-01&#39; - INTERVAL 1 SECOND;
    -> &#39;1997-12-31 23:59:59&#39;
    mysql> SELECT DATE_ADD(&#39;1997-12-31 23:59:59&#39;,
    ->                 INTERVAL 1 SECOND);
    -> &#39;1998-01-01 00:00:00&#39;
    mysql> SELECT DATE_ADD(&#39;1997-12-31 23:59:59&#39;,
    ->                 INTERVAL 1 DAY);
    -> &#39;1998-01-01 23:59:59&#39;
    mysql> SELECT DATE_ADD(&#39;1997-12-31 23:59:59&#39;,
    ->                 INTERVAL &#39;1:1&#39; MINUTE_SECOND);
    -> &#39;1998-01-01 00:01:00&#39;
    mysql> SELECT DATE_SUB(&#39;1998-01-01 00:00:00&#39;,
    ->                 INTERVAL &#39;1 1:1:1&#39; DAY_SECOND);
    -> &#39;1997-12-30 22:58:59&#39;
    mysql> SELECT DATE_ADD(&#39;1998-01-01 00:00:00&#39;,
    ->                 INTERVAL &#39;-1 10&#39; DAY_HOUR);
    -> &#39;1997-12-30 14:00:00&#39;
    mysql> SELECT DATE_SUB(&#39;1998-01-02&#39;, INTERVAL 31 DAY);
    -> &#39;1997-12-02&#39;
    mysql> SELECT DATE_ADD(&#39;1992-12-31 23:59:59.000002&#39;,
    ->            INTERVAL &#39;1.999999&#39; SECOND_MICROSECOND);
    -> &#39;1993-01-01 00:00:01.000001&#39;
    登入後複製

    若你指定了一个过于短的时间间隔值 (不包括type 关键词所预期的所有时间间隔部分), MySQL 假定你已经省去了时间间隔值的最左部分。 例如,你指定了一种类型的DAY_SECOND, expr 的值预期应当具有天、 小时、分钟和秒部分。若你指定了一个类似 '1:10'的值, MySQL 假定天和小时部分不存在,那么这个值代表分和秒。换言之, '1:10' DAY_SECOND 被解释为相当于 '1:10' MINUTE_SECOND。这相当于 MySQL将TIME 值解释为所耗费的时间而不是日时的解释方式。

    假如你对一个日期值添加或减去一些含有时间部分的内容,则结果自动转化为一个日期时间值:

    mysql> SELECT DATE_ADD(&#39;1999-01-01&#39;, INTERVAL 1 DAY);
    -> &#39;1999-01-02&#39;
    mysql> SELECT DATE_ADD(&#39;1999-01-01&#39;, INTERVAL 1 HOUR);
    -> &#39;1999-01-01 01:00:00&#39;
    登入後複製

    假如你使用了格式严重错误的日期,则结果为 NULL。假如你添加了 MONTH、YEAR_MONTH或YEAR ,而结果日期中有一天的日期大于添加的月份的日期最大限度,则这个日期自动被调整为添加月份的最大日期:

    mysql> SELECT DATE_ADD(&#39;1998-01-30&#39;, INTERVAL 1 MONTH);
    -> &#39;1998-02-28&#39;
    登入後複製
    • 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(&#39;1997-10-04 22:23:00&#39;, &#39;%W %M %Y&#39;);        -> &#39;Saturday October 1997&#39;
    mysql> SELECT DATE_FORMAT(&#39;1997-10-04 22:23:00&#39;, &#39;%H:%i:%s&#39;);        -> &#39;22:23:00&#39;
    mysql> SELECT DATE_FORMAT(&#39;1997-10-04 22:23:00&#39;,                          &#39;%D %y %a %d %m %b %j&#39;);
            -> &#39;4th 97 Sat 04 10 Oct 277&#39;
    mysql> SELECT DATE_FORMAT(&#39;1997-10-04 22:23:00&#39;,                          &#39;%H %k %I %r %T %S %w&#39;);
            -> &#39;22 22 10 10:23:00 PM 22:23:00 00 6&#39;
    mysql> SELECT DATE_FORMAT(&#39;1999-01-01&#39;, &#39;%X %V&#39;);        -> &#39;1998 52&#39;
    登入後複製
    • DAY(date)

    DAY() 和DAYOFMONTH()的意义相同。

    • DAYNAME(date)

    返回date 对应的工作日名称。

    mysql> SELECT DAYNAME(&#39;1998-02-05&#39;);
    -> &#39;周四&#39;
    登入後複製
    • DAYOFMONTH(date)

    返回date 对应的该月日期,范围是从 1到31。

    mysql> SELECT DAYOFMONTH(&#39;1998-02-03&#39;);
    -> 3
    登入後複製
    • DAYOFWEEK(date)

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

    mysql> SELECT DAYOFWEEK(&#39;1998-02-03&#39;);
    -> 3
    登入後複製
    • DAYOFYEAR(date)

    返回date 对应的一年中的天数,范围是从 1到366。

    mysql> SELECT DAYOFYEAR(&#39;1998-02-03&#39;);
    -> 34
    登入後複製
    • EXTRACT(type FROM date)

    EXTRACT()函数所使用的时间间隔类型说明符同 DATE_ADD()或DATE_SUB()的相同,但它从日期中提取其部分,而不是执行日期运算。

    mysql> SELECT EXTRACT(YEAR FROM &#39;1999-07-02&#39;);
    -> 1999
    mysql> SELECT EXTRACT(YEAR_MONTH FROM &#39;1999-07-02 01:02:03&#39;);
    -> 199907
    mysql> SELECT EXTRACT(DAY_MINUTE FROM &#39;1999-07-02 01:02:03&#39;);
    -> 20102
    mysql> SELECT EXTRACT(MICROSECOND
    ->                FROM &#39;2003-01-02 10:30:00.00123&#39;);
    -> 123
    登入後複製
    • FROM_DAYS(N)

    给定一个天数 N, 返回一个DATE值。

    mysql> SELECT FROM_DAYS(729669);

    -> &#39;1997-10-07&#39;

    使用 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);
    -> &#39;1997-10-04 22:23:00&#39;
    mysql> SELECT FROM_UNIXTIME(875996580) + 0;
    -> 19971004222300
    mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
    ->                      &#39;%Y %D %M %h:%i:%s %x&#39;);
    -> &#39;2003 6th August 06:22:58 2003&#39;
    登入後複製
    • 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(&#39;2003-10-03&#39;,GET_FORMAT(DATE,&#39;EUR&#39;));
    -> &#39;03.10.2003&#39;
    mysql> SELECT STR_TO_DATE(&#39;10.31.2003&#39;,GET_FORMAT(DATE,&#39;USA&#39;));
    -> &#39;2003-10-31&#39;
    登入後複製
    • 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(&#39;2003-02-05&#39;);
    -> &#39;2003-02-28&#39;
    mysql> SELECT LAST_DAY(&#39;2004-02-05&#39;);
    -> &#39;2004-02-29&#39;
    mysql> SELECT LAST_DAY(&#39;2004-01-01 01:01:01&#39;);
    -> &#39;2004-01-31&#39;
    mysql> SELECT LAST_DAY(&#39;2003-03-32&#39;);
    -> 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);
    -> &#39;2001-01-31&#39;, &#39;2001-02-01&#39;
    mysql> SELECT MAKEDATE(2001,365), MAKEDATE(2004,365);
    -> &#39;2001-12-31&#39;, &#39;2004-12-30&#39;
    mysql> SELECT MAKEDATE(2001,0);
    -> NULL
    登入後複製
    • MAKETIME(hour,minute,second)

    返回由hourminutesecond 参数计算得出的时间值。

    mysql> SELECT MAKETIME(12,15,30);
    -> &#39;12:15:30&#39;
    登入後複製
    • MICROSECOND(expr)

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

    mysql> SELECT MICROSECOND(&#39;12:00:00.123456&#39;);
    -> 123456
    mysql> SELECT MICROSECOND(&#39;1997-12-31 23:59:59.000010&#39;);
    -> 10
    登入後複製
    • MINUTE(time)

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

    mysql> SELECT MINUTE(&#39;98-02-03 10:05:03&#39;);
    -> 5
    登入後複製
    • MONTH(date)

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

    mysql> SELECT MONTH(&#39;1998-02-03&#39;);
    -> 2
    登入後複製
    • MONTHNAME(date)

    返回date 对应月份的全名。

    mysql> SELECT MONTHNAME(&#39;1998-02-05&#39;);
    -> &#39;February &#39;
    登入後複製
    • NOW()

    返回当前日期和时间值,其格式为 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS , 具体格式取决于该函数是否用在字符串中或数字语境中。

    mysql> SELECT NOW();
    -> &#39;1997-12-15 23:50:26&#39;
    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)

    返回周期P1P2 之间的月份数。P1P2 的格式应该为YYMM或YYYYMM。注意周期参数 P1P2 不是日期值。

    mysql> SELECT PERIOD_DIFF(9802,199703);
    -> 11
    登入後複製
    • QUARTER(date)

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

    mysql> SELECT QUARTER(&#39;98-04-01&#39;);
    -> 2
    登入後複製
    • SECOND(time)

    返回time 对应的秒数, 范围是从 0到59。

    mysql> SELECT SECOND(&#39;10:05:03&#39;);
    -> 3
    登入後複製
    • SEC_TO_TIME(seconds)

    返回被转化为小时、 分钟和秒数的seconds参数值, 其格式为 'HH:MM:SS' 或HHMMSS,具体格式根据该函数是否用在字符串或数字语境中而定。

    mysql> SELECT SEC_TO_TIME(2378);
    -> &#39;00:39:38&#39;
    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(&#39;00/00/0000&#39;, &#39;%m/%d/%Y&#39;);
    -> &#39;0000-00-00&#39;
    mysql> SELECT STR_TO_DATE(&#39;04/31/2004&#39;, &#39;%m/%d/%Y&#39;);
    -> &#39;2004-04-31&#39;
    登入後複製
    • SUBDATE(date,INTERVAL expr type) SUBDATE(expr,days)

    当被第二个参数的 INTERVAL型式调用时, SUBDATE()和DATE_SUB()的意义相同。对于有关INTERVAL参数的信息, 见有关 DATE_ADD()的讨论。

    mysql> SELECT DATE_SUB(&#39;1998-01-02&#39;, INTERVAL 31 DAY);
    -> &#39;1997-12-02&#39;
    mysql> SELECT SUBDATE(&#39;1998-01-02&#39;, INTERVAL 31 DAY);
    -> &#39;1997-12-02&#39;
    登入後複製

    第二个形式允许对days使用整数值。在这些情况下,它被算作由日期或日期时间表达式 expr中提取的天数。

    mysql> SELECT SUBDATE(&#39;1998-01-02 12:00:00&#39;, 31);
    -> &#39;1997-12-02 12:00:00&#39;
    登入後複製

    注意不能使用格式 "%X%V" 来将一个 year-week 字符串转化为一个日期,原因是当一个星期跨越一个月份界限时,一个年和星期的组合不能标示一个唯一的年和月份。若要将year-week转化为一个日期,则也应指定具体工作日:

    mysql> select str_to_date(&#39;200442 Monday&#39;, &#39;%X%V %W&#39;);
    -> 2004-10-18
    登入後複製
    • SUBTIME(expr,expr2)

    SUBTIME()从expr 中提取expr2 ,然后返回结果。expr 是一个时间或日期时间表达式,而xpr2 是一个时间表达式。

    mysql> SELECT SUBTIME(&#39;1997-12-31 23:59:59.999999&#39;,&#39;1 1:1:1.000002&#39;);
    -> &#39;1997-12-30 22:58:58.999997&#39;
    mysql> SELECT SUBTIME(&#39;01:00:00.999999&#39;, &#39;02:00:00.999998&#39;);
    -> &#39;-00:59:59.999999&#39;
    登入後複製
    • SYSDATE()

    返回当前日期和时间值,格式为'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS, 具体格式根据函数是否用在字符串或数字语境而定。

    在一个存储程序或触发器中, SYSDATE()返回其执行的时间, 而非存储成都或触发语句开始执行的时间。这个NOW()的运作有所不同。

    • TIME(expr)

    提取一个时间或日期时间表达式的时间部分,并将其以字符串形式返回。

    mysql> SELECT TIME(&#39;2003-12-31 01:02:03&#39;);
    -> &#39;01:02:03&#39;
    mysql> SELECT TIME(&#39;2003-12-31 01:02:03.000123&#39;);
    -> &#39;01:02:03.000123&#39;
    登入後複製
    • TIMEDIFF(expr,expr2)

    TIMEDIFF() 返回起始时间 expr 和结束时间expr2 之间的时间。 exprexpr2 为时间或 date-and-time 表达式,两个的类型必须一样。

    mysql> SELECT TIMEDIFF(&#39;2000:01:01 00:00:00&#39;,
    ->                 &#39;2000:01:01 00:00:00.000001&#39;);
    -> &#39;-00:00:00.000001&#39;
    mysql> SELECT TIMEDIFF(&#39;1997-12-31 23:59:59.000001&#39;,
    ->                 &#39;1997-12-30 01:01:01.000002&#39;);
    -> &#39;46:58:57.999999&#39;
    登入後複製
    • TIMESTAMP(expr) , TIMESTAMP(expr,expr2)

    对于一个单参数,该函数将日期或日期时间表达式 expr 作为日期时间值返回.对于两个参数, 它将时间表达式 expr2 添加到日期或日期时间表达式 expr 中,将theresult作为日期时间值返回。

    mysql> SELECT TIMESTAMP(&#39;2003-12-31&#39;);
    -> &#39;2003-12-31 00:00:00&#39;
    mysql> SELECT TIMESTAMP(&#39;2003-12-31 12:00:00&#39;,&#39;12:00:00&#39;);
    -> &#39;2004-01-01 00:00:00&#39;
    登入後複製
    • 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,&#39;2003-01-02&#39;);
    -> &#39;2003-01-02 00:01:00&#39;
    mysql> SELECT TIMESTAMPADD(WEEK,1,&#39;2003-01-02&#39;);
    -> &#39;2003-01-09&#39;
    登入後複製
    • TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)

    返回日期或日期时间表达式datetime_expr1datetime_expr2the 之间的整数差。其结果的单位由interval 参数给出。interval 的法定值同TIMESTAMPADD()函数说明中所列出的相同。

    mysql> SELECT TIMESTAMPDIFF(MONTH,&#39;2003-02-01&#39;,&#39;2003-05-01&#39;);
    -> 3
    mysql> SELECT TIMESTAMPDIFF(YEAR,&#39;2002-05-01&#39;,&#39;2001-01-01&#39;);
    -> -1
    登入後複製
    • TIME_FORMAT(time,format)

    其使用和 DATE_FORMAT()函数相同, 然而format 字符串可能仅会包含处理小时、分钟和秒的格式说明符。其它说明符产生一个NULL值或0。

    time value包含一个大于23的小时部分,则 %H 和 %k 小时格式说明符会产生一个大于0..23的通常范围的值。另一个小时格式说明符产生小时值模数12。

    mysql> SELECT TIME_FORMAT(&#39;100:00:00&#39;, &#39;%H %k %h %I %l&#39;);
    -> &#39;100 100 04 04 4&#39;
    登入後複製
    • TIME_TO_SEC(time)

    返回已转化为秒的time参数。

    mysql> SELECT TIME_TO_SEC(&#39;22:23:00&#39;);
    -> 80580
    mysql> SELECT TIME_TO_SEC(&#39;00:39:38&#39;);
    -> 2378
    登入後複製
    • TO_DAYS(date)

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

    mysql> SELECT TO_DAYS(950501);
    -> 728779
    mysql> SELECT TO_DAYS(&#39;1997-10-07&#39;);
    -> 729669
    登入後複製

    TO_DAYS() 不用于阳历出现(1582)前的值,原因是当日历改变时,遗失的日期不会被考虑在内。

    请记住, MySQL使用“日期和时间类型”中的规则将日期中的二位数年份值转化为四位。例如, '1997-10-07'和'97-10-07' 被视为同样的日期:

    mysql> SELECT TO_DAYS(&#39;1997-10-07&#39;), TO_DAYS(&#39;97-10-07&#39;);
    -> 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(&#39;1997-10-04 22:23:00&#39;);
    -> 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;
    -> &#39;2003-08-14&#39;, 20030814
    登入後複製
    • UTC_TIME, UTC_TIME()

    返回当前 UTC 值,其格式为 'HH:MM:SS' 或HHMMSS,具体格式根据该函数是否用在字符串或数字语境而定。

    mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
    -> &#39;18:07:53&#39;, 180753
    登入後複製
    • UTC_TIMESTAMP, UTC_TIMESTAMP()

    返回当前UTC日期及时间值,格式为 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS,具体格式根据该函数是否用在字符串或数字语境而定。

    mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
    -> &#39;2003-08-14 18:08:04&#39;, 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(&#39;1998-02-20&#39;);
    -> 7
    mysql> SELECT WEEK(&#39;1998-02-20&#39;,0);
    -> 7
    mysql> SELECT WEEK(&#39;1998-02-20&#39;,1);
    -> 8
    mysql> SELECT WEEK(&#39;1998-12-31&#39;,1);
    -> 53
    登入後複製

    注意,假如有一个日期位于前一年的最后一周, 若你不使用2、3、6或7作为mode 参数选择,则MySQL返回 0:

    mysql> SELECT YEAR(&#39;2000-01-01&#39;), WEEK(&#39;2000-01-01&#39;,0);
    -> 2000, 0
    登入後複製

    有人或许会提出意见,认为 MySQL 对于WEEK() 函数应该返回 52 ,原因是给定的日期实际上发生在1999年的第52周。我们决定返回0作为代替的原因是我们希望该函数能返回“给定年份的星期数”。这使得WEEK() 函数在同其它从日期中抽取日期部分的函数结合时的使用更加可靠。

    假如你更希望所计算的关于年份的结果包括给定日期所在周的第一天,则应使用 0、2、5或 7 作为mode参数选择。

    mysql> SELECT WEEK(&#39;2000-01-01&#39;,2);
    -> 52
    作为选择,可使用 YEARWEEK()函数:
    mysql> SELECT YEARWEEK(&#39;2000-01-01&#39;);
    -> 199952
    mysql> SELECT MID(YEARWEEK(&#39;2000-01-01&#39;),5,2);
    -> &#39;52&#39;
    登入後複製
    • WEEKDAY(date)

    返回date (0 = 周一, 1 = 周二, ... 6 = 周日)对应的工作日索引 weekday index for

    mysql> SELECT WEEKDAY(&#39;1998-02-03 22:23:00&#39;);
    -> 1
    mysql> SELECT WEEKDAY(&#39;1997-11-05&#39;);
    -> 2
    登入後複製
    • WEEKOFYEAR(date)

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

    mysql> SELECT WEEKOFYEAR(&#39;1998-02-20&#39;);
    -> 8
    登入後複製
    • YEAR(date)

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

    mysql> SELECT YEAR(&#39;98-02-03&#39;);
    -> 1998
    登入後複製
    • YEARWEEK(date), YEARWEEK(date,start)

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

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

    -> 198653

    注意,周数和WEEK()函数队可选参数0或 1可能会返回的(0) w有所不同,原因是此时 WEEK() 返回给定年份的语境中的周。