MySQL基礎(chǔ)教程9 — 函數(shù)之日期和時(shí)間函數(shù)

下面的例子使用了時(shí)間函數(shù)。以下詢問選擇了最近的?30天內(nèi)所有帶有date_col?值的記錄:

mysql&gt;?SELECT?something?FROM?tbl_name  -&gt;?WHERE?DATE_SUB(CURDATE(),INTERVAL?30?DAY)?<p>注意,這個(gè)詢問也能選擇將來的日期記錄。</p><p>用于日期值的函數(shù)通常會接受時(shí)間日期值而忽略時(shí)間部分。而用于時(shí)間值的函數(shù)通常接受時(shí)間日期值而忽略日期部分。</p><p>返回各自當(dāng)前日期或時(shí)間的函數(shù)在每次詢問執(zhí)行開始時(shí)計(jì)算一次。這意味著在一個(gè)單一詢問中,對諸如NOW()?的函數(shù)多次訪問總是會得到同樣的結(jié)果(未達(dá)到我們的目的,單一詢問也包括對存儲程序或觸發(fā)器和被該程序/觸發(fā)器調(diào)用的所有子程序的調(diào)用?)。這項(xiàng)原則也適用于?CURDATE()、?CURTIME()、?UTC_DATE()、?UTC_TIME()、UTC_timestamp(),以及所有和它們意義相同的函數(shù)。</p><p>CURRENT_TIMESTAMP()、?CURRENT_TIME()、?CURRENT_DATE()以及FROM_UNIXTIME()函數(shù)返回連接當(dāng)前時(shí)區(qū)內(nèi)的值,這個(gè)值可用作time_zone系統(tǒng)變量的值。此外,?UNIX_TIMESTAMP()?假設(shè)其參數(shù)為一個(gè)當(dāng)前時(shí)區(qū)的時(shí)間日期值。</p><p>以下函數(shù)的論述中返回值的范圍會請求完全日期。 若一個(gè)日期為“零” 值,或者是一個(gè)諸如'2001-11-00'之類的不完全日期, 提取部分日期值的函數(shù)可能會返回?0。 例如,?DAYOFMONTH('2001-11-00')?會返回0。</p>
  • ADDDATE(date,INTERVAL?expr?type) ADDDATE(expr,days)

當(dāng)被第二個(gè)參數(shù)的INTERVAL格式激活后,?ADDDATE()就是DATE_ADD()的同義詞。相關(guān)函數(shù)SUBDATE()?則是DATE_SUB()的同義詞。對于INTERVAL參數(shù)上的信息 ,請參見關(guān)于DATE_ADD()的論述。

mysql&gt;?SELECT?DATE_ADD('1998-01-02',?INTERVAL?31?DAY);  -&gt;?'1998-02-02'  mysql&gt;?SELECT?ADDDATE('1998-01-02',?INTERVAL?31?DAY);  -&gt;?'1998-02-02'  若?days?參數(shù)只是整數(shù)值,則?MySQL?5.1將其作為天數(shù)值添加至?expr。  mysql&gt;?SELECT?ADDDATE('1998-01-02',?31);  -&gt;?'1998-02-02'
  • ADDTIME(expr,expr2)

ADDTIME()將?expr2添加至expr?然后返回結(jié)果。?expr?是一個(gè)時(shí)間或時(shí)間日期表達(dá)式,而expr2?是一個(gè)時(shí)間表達(dá)式。

mysql&gt;?SELECT?ADDTIME('1997-12-31?23:59:59.999999',  -&gt;????????????????'1?1:1:1.000002');  -&gt;?'1998-01-02?01:01:01.000001'  mysql&gt;?SELECT?ADDTIME('01:00:00.999999',?'02:00:00.999998');  -&gt;?'03:00:01.999997'
  • CONVERT_TZ(dt,from_tz,to_tz)

CONVERT_TZ()?將時(shí)間日期值dt?從from_tz?給出的時(shí)區(qū)轉(zhuǎn)到to_tz給出的時(shí)區(qū),然后返回結(jié)果值。若自變量無效,則這個(gè)函數(shù)會返回?NULL。

在從若from_tz?到UTC的轉(zhuǎn)化過程中,該值超出?TIMESTAMP?類型的被支持范圍,那么轉(zhuǎn)化不會發(fā)生。

mysql&gt;?SELECT?CONVERT_TZ('2004-01-01?12:00:00','GMT','MET');  -&gt;?'2004-01-01?13:00:00'  mysql&gt;?SELECT?CONVERT_TZ('2004-01-01?12:00:00','+00:00','+10:00');  -&gt;?'2004-01-01?22:00:00'

注釋:若要使用諸如?‘MET’或?‘Europe/Moscow’之類的指定時(shí)間區(qū),首先要設(shè)置正確的時(shí)區(qū)表。

  • CURDATE()

將當(dāng)前日期按照’YYYY-MM-DD’?或YYYYMMDD?格式的值返回,具體格式根據(jù)函數(shù)用在字符串或是數(shù)字語境中而定。

mysql&gt;?SELECT?CURDATE();  -&gt;?'1997-12-15'  mysql&gt;?SELECT?CURDATE()?+?0;  -&gt;?19971215
  • CURRENT_DATE CURRENT_DATE()

CURRENT_DATE和CURRENT_DATE()是的同義詞.

  • CURTIME()

將當(dāng)前時(shí)間以’HH:MM:SS’或?HHMMSS?的格式返回, 具體格式根據(jù)函數(shù)用在字符串或是數(shù)字語境中而定。

mysql&gt;?SELECT?CURTIME();  -&gt;?'23:50:26'  mysql&gt;?SELECT?CURTIME()?+?0;  -&gt;?235026
  • CURRENT_TIME, CURRENT_TIME()

CURRENT_TIME?和CURRENT_TIME()?是CURTIME()的同義詞。

  • CURRENT_TIMESTAMP, CURRENT_TIMESTAMP()

CURRENT_TIMESTAMP和?CURRENT_TIMESTAMP()是NOW()的同義詞。

  • DATE(expr)

提取日期或時(shí)間日期表達(dá)式expr中的日期部分。

mysql&gt;?SELECT?DATE('2003-12-31?01:02:03');  -&gt;?'2003-12-31'
  • DATEDIFF(expr,expr2)

DATEDIFF()?返回起始時(shí)間?expr和結(jié)束時(shí)間expr2之間的天數(shù)。Exprexpr2?為日期或?date-and-time?表達(dá)式。計(jì)算中只用到這些值的日期部分。

mysql&gt;?SELECT?DATEDIFF('1997-12-31?23:59:59','1997-12-30');  -&gt;?1  mysql&gt;?SELECT?DATEDIFF('1997-11-30?23:59:59','1997-12-31');  -&gt;?-31
  • DATE_ADD(date,INTERVAL?expr?type) DATE_SUB(date,INTERVAL?expr?type)

這些函數(shù)執(zhí)行日期運(yùn)算。?date?是一個(gè)?DATETIME?或DATE值,用來指定起始時(shí)間。?expr?是一個(gè)表達(dá)式,用來指定從起始日期添加或減去的時(shí)間間隔值。??Expr是一個(gè)字符串;對于負(fù)值的時(shí)間間隔,它可以以一個(gè) ‘-’開頭。?type?為關(guān)鍵詞,它指示了表達(dá)式被解釋的方式。

關(guān)鍵詞INTERVA及?type?分類符均不區(qū)分大小寫。

以下表顯示了type?和expr?參數(shù)的關(guān)系:

type? 預(yù)期的?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’

MySQL?允許任何expr?格式中的標(biāo)點(diǎn)分隔符。表中所顯示的是建議的 分隔符。若?date?參數(shù)是一個(gè)?DATE?值,而你的計(jì)算只會包括?YEAR、MONTH和DAY部分(即,?沒有時(shí)間部分),?其結(jié)果是一個(gè)DATE?值。否則,結(jié)果將是一個(gè)?DATETIME值。

若位于另一端的表達(dá)式是一個(gè)日期或日期時(shí)間值 , 則INTERVAL?expr?type只允許在?+?操作符的兩端。對于 –操作符,? INTERVAL?expr?type?只允許在其右端,原因是從一個(gè)時(shí)間間隔中提取一個(gè)日期或日期時(shí)間值是毫無意義的。?(見下面的例子)。

mysql&gt;?SELECT?'1997-12-31?23:59:59'?+?INTERVAL?1?SECOND;  -&gt;?'1998-01-01?00:00:00'  mysql&gt;?SELECT?INTERVAL?1?DAY?+?'1997-12-31';  -&gt;?'1998-01-01'  mysql&gt;?SELECT?'1998-01-01'?-?INTERVAL?1?SECOND;  -&gt;?'1997-12-31?23:59:59'  mysql&gt;?SELECT?DATE_ADD('1997-12-31?23:59:59',  -&gt;?????????????????INTERVAL?1?SECOND);  -&gt;?'1998-01-01?00:00:00'  mysql&gt;?SELECT?DATE_ADD('1997-12-31?23:59:59',  -&gt;?????????????????INTERVAL?1?DAY);  -&gt;?'1998-01-01?23:59:59'  mysql&gt;?SELECT?DATE_ADD('1997-12-31?23:59:59',  -&gt;?????????????????INTERVAL?'1:1'?MINUTE_SECOND);  -&gt;?'1998-01-01?00:01:00'  mysql&gt;?SELECT?DATE_SUB('1998-01-01?00:00:00',  -&gt;?????????????????INTERVAL?'1?1:1:1'?DAY_SECOND);  -&gt;?'1997-12-30?22:58:59'  mysql&gt;?SELECT?DATE_ADD('1998-01-01?00:00:00',  -&gt;?????????????????INTERVAL?'-1?10'?DAY_HOUR);  -&gt;?'1997-12-30?14:00:00'  mysql&gt;?SELECT?DATE_SUB('1998-01-02',?INTERVAL?31?DAY);  -&gt;?'1997-12-02'  mysql&gt;?SELECT?DATE_ADD('1992-12-31?23:59:59.000002',  -&gt;????????????INTERVAL?'1.999999'?SECOND_MICROSECOND);  -&gt;?'1993-01-01?00:00:01.000001'

若你指定了一個(gè)過于短的時(shí)間間隔值?(不包括type?關(guān)鍵詞所預(yù)期的所有時(shí)間間隔部分), MySQL?假定你已經(jīng)省去了時(shí)間間隔值的最左部分。 例如,你指定了一種類型的DAY_SECOND,?expr?的值預(yù)期應(yīng)當(dāng)具有天、 小時(shí)、分鐘和秒部分。若你指定了一個(gè)類似?‘1:10’的值, MySQL?假定天和小時(shí)部分不存在,那么這個(gè)值代表分和秒。換言之, ‘1:10’ DAY_SECOND?被解釋為相當(dāng)于?‘1:10’ MINUTE_SECOND。這相當(dāng)于?MySQL將TIME?值解釋為所耗費(fèi)的時(shí)間而不是日時(shí)的解釋方式。

假如你對一個(gè)日期值添加或減去一些含有時(shí)間部分的內(nèi)容,則結(jié)果自動轉(zhuǎn)化為一個(gè)日期時(shí)間值:

mysql&gt;?SELECT?DATE_ADD('1999-01-01',?INTERVAL?1?DAY);  -&gt;?'1999-01-02'  mysql&gt;?SELECT?DATE_ADD('1999-01-01',?INTERVAL?1?HOUR);  -&gt;?'1999-01-01?01:00:00'

假如你使用了格式嚴(yán)重錯(cuò)誤的日期,則結(jié)果為?NULL。假如你添加了? MONTH、YEAR_MONTH或YEAR?,而結(jié)果日期中有一天的日期大于添加的月份的日期最大限度,則這個(gè)日期自動被調(diào)整為添加月份的最大日期:

mysql&gt;?SELECT?DATE_ADD('1998-01-30',?INTERVAL?1?MONTH);  -&gt;?'1998-02-28'
  • DATE_FORMAT(date,format)

根據(jù)format?字符串安排date?值的格式。

以下說明符可用在?format?字符串中:

說明符 說明
%a 工作日的縮寫名稱? (Sun..Sat)
%b 月份的縮寫名稱? (Jan..Dec)
%c 月份,數(shù)字形式(0..12)
%D 帶有英語后綴的該月日期? (0th,?1st,?2nd,?3rd, …)
%d 該月日期,?數(shù)字形式?(00..31)
%e 該月日期,?數(shù)字形式(0..31)
%f 微秒?(000000..999999)
%H 小時(shí)(00..23)
%h 小時(shí)(01..12)
%I 小時(shí)?(01..12)
%i 分鐘,數(shù)字形式?(00..59)
%j 一年中的天數(shù)?(001..366)
%k 小時(shí)?(0..23)
%l 小時(shí)?(1..12)
%M 月份名稱?(January..December)
%m 月份,?數(shù)字形式?(00..12)
%p 上午(AM)或下午(?PM)
%r 時(shí)間?, 12小時(shí)制?(小時(shí)hh:分鐘mm:秒數(shù)ss?后加?AM或PM)
%S 秒?(00..59)
%s 秒?(00..59)
%T 時(shí)間?, 24小時(shí)制?(小時(shí)hh:分鐘mm:秒數(shù)ss)
%U 周?(00..53),?其中周日為每周的第一天
%u 周?(00..53),?其中周一為每周的第一天
%V 周?(01..53),?其中周日為每周的第一天?;?和?%X同時(shí)使用
%v 周?(01..53),?其中周一為每周的第一天?;?和?%x同時(shí)使用
%W 工作日名稱?(周日..周六)
%w 一周中的每日?(0=周日..6=周六)
%X 該周的年份,其中周日為每周的第一天,?數(shù)字形式,4位數(shù);和%V同時(shí)使用
%x 該周的年份,其中周一為每周的第一天,?數(shù)字形式,4位數(shù);和%v同時(shí)使用
%Y 年份,?數(shù)字形式,4位數(shù)
%y 年份,?數(shù)字形式?(2位數(shù))
%% ‘%’文字字符

所有其它字符都被復(fù)制到結(jié)果中,無需作出解釋。

注意, ‘%’字符要求在格式指定符之前。

月份和日期說明符的范圍從零開始,原因是?MySQL允許存儲諸如?‘2004-00-00’的不完全日期.

mysql&gt;?SELECT?DATE_FORMAT('1997-10-04?22:23:00',?'%W?%M?%Y');????????-&gt;?'Saturday?October?1997'  mysql&gt;?SELECT?DATE_FORMAT('1997-10-04?22:23:00',?'%H:%i:%s');????????-&gt;?'22:23:00'  mysql&gt;?SELECT?DATE_FORMAT('1997-10-04?22:23:00',??????????????????????????'%D?%y?%a?%d?%m?%b?%j');  ????????-&gt;?'4th?97?Sat?04?10?Oct?277'  mysql&gt;?SELECT?DATE_FORMAT('1997-10-04?22:23:00',??????????????????????????'%H?%k?%I?%r?%T?%S?%w');  ????????-&gt;?'22?22?10?10:23:00?PM?22:23:00?00?6'  mysql&gt;?SELECT?DATE_FORMAT('1999-01-01',?'%X?%V');????????-&gt;?'1998?52'
  • DAY(date)

DAY()?和DAYOFMONTH()的意義相同。

  • DAYNAME(date)

返回date?對應(yīng)的工作日名稱。

mysql&gt;?SELECT?DAYNAME('1998-02-05');  -&gt;?'周四'
  • DAYOFMONTH(date)

返回date?對應(yīng)的該月日期,范圍是從?1到31。

mysql&gt;?SELECT?DAYOFMONTH('1998-02-03');  -&gt;?3
  • DAYOFWEEK(date)

返回date?(1 =?周日, 2 =?周一, …, 7 =?周六)對應(yīng)的工作日索引。這些索引值符合?ODBC標(biāo)準(zhǔn)。

mysql&gt;?SELECT?DAYOFWEEK('1998-02-03');  -&gt;?3
  • DAYOFYEAR(date)

返回date?對應(yīng)的一年中的天數(shù),范圍是從?1到366。

mysql&gt;?SELECT?DAYOFYEAR('1998-02-03');  -&gt;?34
  • EXTRACT(type?FROM?date)

EXTRACT()函數(shù)所使用的時(shí)間間隔類型說明符同?DATE_ADD()或DATE_SUB()的相同,但它從日期中提取其部分,而不是執(zhí)行日期運(yùn)算。

mysql&gt;?SELECT?EXTRACT(YEAR?FROM?'1999-07-02');  -&gt;?1999  mysql&gt;?SELECT?EXTRACT(YEAR_MONTH?FROM?'1999-07-02?01:02:03');  -&gt;?199907  mysql&gt;?SELECT?EXTRACT(DAY_MINUTE?FROM?'1999-07-02?01:02:03');  -&gt;?20102  mysql&gt;?SELECT?EXTRACT(MICROSECOND  -&gt;????????????????FROM?'2003-01-02?10:30:00.00123');  -&gt;?123
  • FROM_DAYS(N)

給定一個(gè)天數(shù)??N,?返回一個(gè)DATE值。

mysql>?SELECT FROM_DAYS(729669);

-> ‘1997-10-07’

使用?FROM_DAYS()處理古老日期時(shí),務(wù)必謹(jǐn)慎。他不用于處理陽歷出現(xiàn)前的日期(1582)。

  • FROM_UNIXTIME(unix_timestamp) , FROM_UNIXTIME(unix_timestamp,format)

返回’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS?格式值的unix_timestamp參數(shù)表示,具體格式取決于該函數(shù)是否用在字符串中或是數(shù)字語境中。

format?已經(jīng)給出,則結(jié)果的格式是根據(jù)format?字符串而定。?format?可以包含同DATE_FORMAT()?函數(shù)輸入項(xiàng)列表中相同的說明符。

mysql&gt;?SELECT?FROM_UNIXTIME(875996580);  -&gt;?'1997-10-04?22:23:00'  mysql&gt;?SELECT?FROM_UNIXTIME(875996580)?+?0;  -&gt;?19971004222300  mysql&gt;?SELECT?FROM_UNIXTIME(UNIX_TIMESTAMP(),  -&gt;??????????????????????'%Y?%D?%M?%h:%i:%s?%x');  -&gt;?'2003?6th?August?06:22:58?2003'
  • GET_FORMAT(DATE|TIME|DATETIME, ‘EUR’|’USA’|’JIS’|’ISO’|’INTERNAL’)

返回一個(gè)格式字符串。這個(gè)函數(shù)在同DATE_FORMAT()?及STR_TO_DATE()函數(shù)結(jié)合時(shí)很有用。

第一個(gè)參數(shù)的3個(gè)可能值和第二個(gè)參數(shù)的5個(gè)可能值產(chǎn)生?15?個(gè)可能格式字符串?(對于使用的說明符,請參見DATE_FORMAT()函數(shù)說明表?)。

函數(shù)調(diào)用 結(jié)果
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,?這時(shí)GET_FORMAT()的返回值和DATETIME相同。

mysql&gt;?SELECT?DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR'));  -&gt;?'03.10.2003'  mysql&gt;?SELECT?STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA'));  -&gt;?'2003-10-31'
  • HOUR(time)

返回time?對應(yīng)的小時(shí)數(shù)。對于日時(shí)值的返回值范圍是從?0?到?23?。

mysql>?SELECT HOUR(’10:05:03′);

-> 10

然而,? TIME?值的范圍實(shí)際上非常大,?所以HOUR可以返回大于23的值。

mysql>?SELECT HOUR(‘272:59:59’);

-> 272

  • LAST_DAY(date)

獲取一個(gè)日期或日期時(shí)間值,返回該月最后一天對應(yīng)的值。若參數(shù)無效,則返回NULL。

mysql&gt;?SELECT?LAST_DAY('2003-02-05');  -&gt;?'2003-02-28'  mysql&gt;?SELECT?LAST_DAY('2004-02-05');  -&gt;?'2004-02-29'  mysql&gt;?SELECT?LAST_DAY('2004-01-01?01:01:01');  -&gt;?'2004-01-31'  mysql&gt;?SELECT?LAST_DAY('2003-03-32');  -&gt;?NULL
  • LOCALTIME, LOCALTIME()

LOCALTIME?及?LOCALTIME()和NOW()具有相同意義。

  • LOCALTIMESTAMP, LOCALTIMESTAMP()

LOCALTIMESTAMP和LOCALTIMESTAMP()和NOW()具有相同意義。

  • MAKEDATE(year,dayofyear)

給出年份值和一年中的天數(shù)值,返回一個(gè)日期。dayofyear?必須大于?0?,否則結(jié)果為?NULL。

mysql&gt;?SELECT?MAKEDATE(2001,31),?MAKEDATE(2001,32);  -&gt;?'2001-01-31',?'2001-02-01'  mysql&gt;?SELECT?MAKEDATE(2001,365),?MAKEDATE(2004,365);  -&gt;?'2001-12-31',?'2004-12-30'  mysql&gt;?SELECT?MAKEDATE(2001,0);  -&gt;?NULL
  • MAKETIME(hour,minute,second)

返回由hour、?minutesecond?參數(shù)計(jì)算得出的時(shí)間值。

mysql&gt;?SELECT?MAKETIME(12,15,30);  -&gt;?'12:15:30'
  • MICROSECOND(expr)

從時(shí)間或日期時(shí)間表達(dá)式expr返回微秒值,其數(shù)字范圍從?0到?999999。

mysql&gt;?SELECT?MICROSECOND('12:00:00.123456');  -&gt;?123456  mysql&gt;?SELECT?MICROSECOND('1997-12-31?23:59:59.000010');  -&gt;?10
  • MINUTE(time)

返回?time?對應(yīng)的分鐘數(shù),范圍是從?0?到?59。

mysql&gt;?SELECT?MINUTE('98-02-03?10:05:03');  -&gt;?5
  • MONTH(date)

返回date?對應(yīng)的月份,范圍時(shí)從?1?到?12。

mysql&gt;?SELECT?MONTH('1998-02-03');  -&gt;?2
  • MONTHNAME(date)

返回date?對應(yīng)月份的全名。

mysql&gt;?SELECT?MONTHNAME('1998-02-05');  -&gt;?'February?'
  • NOW()

返回當(dāng)前日期和時(shí)間值,其格式為?‘YYYY-MM-DD HH:MM:SS’?或YYYYMMDDHHMMSS?, 具體格式取決于該函數(shù)是否用在字符串中或數(shù)字語境中。

mysql&gt;?SELECT?NOW();  -&gt;?'1997-12-15?23:50:26'  mysql&gt;?SELECT?NOW()?+?0;  -&gt;?19971215235026

在一個(gè)存儲程序或觸發(fā)器內(nèi), NOW()?返回一個(gè)常數(shù)時(shí)間,該常數(shù)指示了該程序或觸發(fā)語句開始執(zhí)行的時(shí)間。這同SYSDATE()的運(yùn)行有所不同。

  • PERIOD_ADD(P,N)

添加?N?個(gè)月至周期P?(格式為YYMM?或YYYYMM),返回值的格式為?YYYYMM。注意周期參數(shù)?P?不是日期值。

mysql&gt;?SELECT?PERIOD_ADD(9801,2);  -&gt;?199803
  • PERIOD_DIFF(P1,P2)

返回周期P1和?P2?之間的月份數(shù)。P1?和P2?的格式應(yīng)該為YYMM或YYYYMM。注意周期參數(shù)?P1P2?不是日期值。

mysql&gt;?SELECT?PERIOD_DIFF(9802,199703);  -&gt;?11
  • QUARTER(date)

返回date?對應(yīng)的一年中的季度值,范圍是從?1到?4。

mysql&gt;?SELECT?QUARTER('98-04-01');  -&gt;?2
  • SECOND(time)

返回time?對應(yīng)的秒數(shù),?范圍是從?0到59。

mysql&gt;?SELECT?SECOND('10:05:03');  -&gt;?3
  • SEC_TO_TIME(seconds)

返回被轉(zhuǎn)化為小時(shí)、 分鐘和秒數(shù)的seconds參數(shù)值,?其格式為?‘HH:MM:SS’?或HHMMSS,具體格式根據(jù)該函數(shù)是否用在字符串或數(shù)字語境中而定。

mysql&gt;?SELECT?SEC_TO_TIME(2378);  -&gt;?'00:39:38'  mysql&gt;?SELECT?SEC_TO_TIME(2378)?+?0;  -&gt;?3938
  • STR_TO_DATE(str,format)

這是DATE_FORMAT()?函數(shù)的倒轉(zhuǎn)。它獲取一個(gè)字符串?str?和一個(gè)格式字符串format。若格式字符串包含日期和時(shí)間部分,則?STR_TO_DATE()返回一個(gè)?DATETIME?值, 若該字符串只包含日期部分或時(shí)間部分,則返回一個(gè)?DATE?或TIME值。

str所包含的日期、時(shí)間或日期時(shí)間值應(yīng)該在format指示的格式中被給定。對于可用在format中的說明符,請參見DATE_FORMAT()?函數(shù)說明表。 所有其它的字符被逐字獲取,因此不會被解釋。若?str?包含一個(gè)非法日期、時(shí)間或日期時(shí)間值,則?STR_TO_DATE()返回NULL。同時(shí),一個(gè)非法值會引起警告。

其意義是,例如,?只要具體日期部分的范圍時(shí)從?1到?31之間,則允許一個(gè)日期中的具體日期部分大于一個(gè)月中天數(shù)值。并且,允許“零”日期或帶有0值部分的日期。

mysql&gt;?SELECT?STR_TO_DATE('00/00/0000',?'%m/%d/%Y');  -&gt;?'0000-00-00'  mysql&gt;?SELECT?STR_TO_DATE('04/31/2004',?'%m/%d/%Y');  -&gt;?'2004-04-31'
  • SUBDATE(date,INTERVAL?expr?type) SUBDATE(expr,days)

當(dāng)被第二個(gè)參數(shù)的?INTERVAL型式調(diào)用時(shí), SUBDATE()和DATE_SUB()的意義相同。對于有關(guān)INTERVAL參數(shù)的信息, 見有關(guān)?DATE_ADD()的討論。

mysql&gt;?SELECT?DATE_SUB('1998-01-02',?INTERVAL?31?DAY);  -&gt;?'1997-12-02'  mysql&gt;?SELECT?SUBDATE('1998-01-02',?INTERVAL?31?DAY);  -&gt;?'1997-12-02'

第二個(gè)形式允許對days使用整數(shù)值。在這些情況下,它被算作由日期或日期時(shí)間表達(dá)式?expr中提取的天數(shù)。

mysql&gt;?SELECT?SUBDATE('1998-01-02?12:00:00',?31);  -&gt;?'1997-12-02?12:00:00'

注意不能使用格式?“%X%V”?來將一個(gè)?year-week?字符串轉(zhuǎn)化為一個(gè)日期,原因是當(dāng)一個(gè)星期跨越一個(gè)月份界限時(shí),一個(gè)年和星期的組合不能標(biāo)示一個(gè)唯一的年和月份。若要將year-week轉(zhuǎn)化為一個(gè)日期,則也應(yīng)指定具體工作日:

mysql&gt;?select?str_to_date('200442?Monday',?'%X%V?%W');  -&gt;?2004-10-18
  • SUBTIME(expr,expr2)

SUBTIME()從expr?中提取expr2?,然后返回結(jié)果。expr?是一個(gè)時(shí)間或日期時(shí)間表達(dá)式,而xpr2?是一個(gè)時(shí)間表達(dá)式。

mysql&gt;?SELECT?SUBTIME('1997-12-31?23:59:59.999999','1?1:1:1.000002');  -&gt;?'1997-12-30?22:58:58.999997'  mysql&gt;?SELECT?SUBTIME('01:00:00.999999',?'02:00:00.999998');  -&gt;?'-00:59:59.999999'
  • SYSDATE()

返回當(dāng)前日期和時(shí)間值,格式為’YYYY-MM-DD HH:MM:SS’?或YYYYMMDDHHMMSS, 具體格式根據(jù)函數(shù)是否用在字符串或數(shù)字語境而定。

在一個(gè)存儲程序或觸發(fā)器中, SYSDATE()返回其執(zhí)行的時(shí)間,?而非存儲成都或觸發(fā)語句開始執(zhí)行的時(shí)間。這個(gè)NOW()的運(yùn)作有所不同。

  • TIME(expr)

提取一個(gè)時(shí)間或日期時(shí)間表達(dá)式的時(shí)間部分,并將其以字符串形式返回。

mysql&gt;?SELECT?TIME('2003-12-31?01:02:03');  -&gt;?'01:02:03'  mysql&gt;?SELECT?TIME('2003-12-31?01:02:03.000123');  -&gt;?'01:02:03.000123'
  • TIMEDIFF(expr,expr2)

TIMEDIFF()?返回起始時(shí)間?expr?和結(jié)束時(shí)間expr2?之間的時(shí)間。?expr?和expr2?為時(shí)間或?date-and-time?表達(dá)式,兩個(gè)的類型必須一樣。

mysql&gt;?SELECT?TIMEDIFF('2000:01:01?00:00:00',  -&gt;?????????????????'2000:01:01?00:00:00.000001');  -&gt;?'-00:00:00.000001'  mysql&gt;?SELECT?TIMEDIFF('1997-12-31?23:59:59.000001',  -&gt;?????????????????'1997-12-30?01:01:01.000002');  -&gt;?'46:58:57.999999'
  • TIMESTAMP(expr) , TIMESTAMP(expr,expr2)

對于一個(gè)單參數(shù),該函數(shù)將日期或日期時(shí)間表達(dá)式?expr?作為日期時(shí)間值返回.對于兩個(gè)參數(shù),?它將時(shí)間表達(dá)式?expr2?添加到日期或日期時(shí)間表達(dá)式?expr?中,將theresult作為日期時(shí)間值返回。

mysql&gt;?SELECT?TIMESTAMP('2003-12-31');  -&gt;?'2003-12-31?00:00:00'  mysql&gt;?SELECT?TIMESTAMP('2003-12-31?12:00:00','12:00:00');  -&gt;?'2004-01-01?00:00:00'
  • TIMESTAMPADD(interval,int_expr,datetime_expr)

將整型表達(dá)式int_expr?添加到日期或日期時(shí)間表達(dá)式?datetime_expr中。?int_expr?的單位被時(shí)間間隔參數(shù)給定,該參數(shù)必須是以下值的其中一個(gè):?FRAC_SECOND、SECOND、?MINUTE、?HOUR、?DAY、?WEEK、?MONTH、?QUARTER或?YEAR。

可使用所顯示的關(guān)鍵詞指定Interval值,或使用SQL_TSI_前綴。例如, DAY或SQL_TSI_DAY?都是正確的。

mysql&gt;?SELECT?TIMESTAMPADD(MINUTE,1,'2003-01-02');  -&gt;?'2003-01-02?00:01:00'  mysql&gt;?SELECT?TIMESTAMPADD(WEEK,1,'2003-01-02');  -&gt;?'2003-01-09'
  • TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)

返回日期或日期時(shí)間表達(dá)式datetime_expr1?和datetime_expr2the?之間的整數(shù)差。其結(jié)果的單位由interval?參數(shù)給出。interval?的法定值同TIMESTAMPADD()函數(shù)說明中所列出的相同。

mysql&gt;?SELECT?TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');  -&gt;?3  mysql&gt;?SELECT?TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');  -&gt;?-1
  • TIME_FORMAT(time,format)

其使用和?DATE_FORMAT()函數(shù)相同,?然而format?字符串可能僅會包含處理小時(shí)、分鐘和秒的格式說明符。其它說明符產(chǎn)生一個(gè)NULL值或0。

time?value包含一個(gè)大于23的小時(shí)部分,則?%H?和?%k?小時(shí)格式說明符會產(chǎn)生一個(gè)大于0..23的通常范圍的值。另一個(gè)小時(shí)格式說明符產(chǎn)生小時(shí)值模數(shù)12。

mysql&gt;?SELECT?TIME_FORMAT('100:00:00',?'%H?%k?%h?%I?%l');  -&gt;?'100?100?04?04?4'
  • TIME_TO_SEC(time)

返回已轉(zhuǎn)化為秒的time參數(shù)。

mysql&gt;?SELECT?TIME_TO_SEC('22:23:00');  -&gt;?80580  mysql&gt;?SELECT?TIME_TO_SEC('00:39:38');  -&gt;?2378
  • TO_DAYS(date)

給定一個(gè)日期date,?返回一個(gè)天數(shù)?(從年份0開始的天數(shù)?)。

mysql&gt;?SELECT?TO_DAYS(950501);  -&gt;?728779  mysql&gt;?SELECT?TO_DAYS('1997-10-07');  -&gt;?729669

TO_DAYS()?不用于陽歷出現(xiàn)(1582)前的值,原因是當(dāng)日歷改變時(shí),遺失的日期不會被考慮在內(nèi)。

請記住,?MySQL使用“日期和時(shí)間類型”中的規(guī)則將日期中的二位數(shù)年份值轉(zhuǎn)化為四位。例如,? ‘1997-10-07’和’97-10-07’?被視為同樣的日期:

mysql&gt;?SELECT?TO_DAYS('1997-10-07'),?TO_DAYS('97-10-07');  -&gt;?729669,?729669

對于1582?年之前的日期(或許在其它地區(qū)為下一年?),?該函數(shù)的結(jié)果實(shí)不可靠的。

  • UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)

若無參數(shù)調(diào)用,則返回一個(gè)Unix timestamp (‘1970-01-01 00:00:00’ GMT?之后的秒數(shù))?作為無符號整數(shù)。若用date?來調(diào)用UNIX_TIMESTAMP(),它會將參數(shù)值以’1970-01-01 00:00:00′ GMT后的秒數(shù)的形式返回。date?可以是一個(gè)DATE?字符串、一個(gè)?DATETIME字符串、一個(gè)?TIMESTAMP或一個(gè)當(dāng)?shù)貢r(shí)間的YYMMDD?或YYYMMDD格式的數(shù)字。

mysql&gt;?SELECT?UNIX_TIMESTAMP();  -&gt;?882226357  mysql&gt;?SELECT?UNIX_TIMESTAMP('1997-10-04?22:23:00');  -&gt;?875996580

當(dāng)?UNIX_TIMESTAMP被用在?TIMESTAMP列時(shí),?函數(shù)直接返回內(nèi)部時(shí)戳值,??而不進(jìn)行任何隱含的 “string-to-Unix-timestamp”轉(zhuǎn)化。假如你向UNIX_TIMESTAMP()傳遞一個(gè)溢出日期,它會返回?0,但請注意只有基本范圍檢查會被履行(年份從1970?到?2037, 月份從01到12,日期從? 01?到31)。

假如你想要減去?UNIX_TIMESTAMP()?列,?你或許希望刪去帶符號整數(shù)的結(jié)果。

  • UTC_DATE, UTC_DATE()

返回當(dāng)前?UTC日期值,其格式為?‘YYYY-MM-DD’?或?YYYYMMDD,具體格式取決于函數(shù)是否用在字符串或數(shù)字語境中。

mysql&gt;?SELECT?UTC_DATE(),?UTC_DATE()?+?0;  -&gt;?'2003-08-14',?20030814
  • UTC_TIME, UTC_TIME()

返回當(dāng)前?UTC?值,其格式為? ‘HH:MM:SS’?或HHMMSS,具體格式根據(jù)該函數(shù)是否用在字符串或數(shù)字語境而定。

mysql&gt;?SELECT?UTC_TIME(),?UTC_TIME()?+?0;  -&gt;?'18:07:53',?180753
  • UTC_TIMESTAMP, UTC_TIMESTAMP()

返回當(dāng)前UTC日期及時(shí)間值,格式為?‘YYYY-MM-DD HH:MM:SS’?或YYYYMMDDHHMMSS,具體格式根據(jù)該函數(shù)是否用在字符串或數(shù)字語境而定。

mysql&gt;?SELECT?UTC_TIMESTAMP(),?UTC_TIMESTAMP()?+?0;  -&gt;?'2003-08-14?18:08:04',?20030814180804
  • WEEK(date[,mode])

該函數(shù)返回date?對應(yīng)的星期數(shù)。WEEK()?的雙參數(shù)形式允許你指定該星期是否起始于周日或周一, 以及返回值的范圍是否為從0?到53?或從1?到53。若?mode參數(shù)被省略,則使用default_week_format系統(tǒng)自變量的值。

以下表說明了mode?參數(shù)的工作過程:d

第一天
Mode 工作日 范圍 Week 1?為第一周?…
0 周日 0-53 本年度中有一個(gè)周日
1 周一 0-53 本年度中有3天以上
2 周日 1-53 本年度中有一個(gè)周日
3 周一 1-53 本年度中有3天以上
4 周日 0-53 本年度中有3天以上
5 周一 0-53 本年度中有一個(gè)周一
6 周日 1-53 本年度中有3天以上
7 周一 1-53 本年度中有一個(gè)周一
mysql&gt;?SELECT?WEEK('1998-02-20');  -&gt;?7  mysql&gt;?SELECT?WEEK('1998-02-20',0);  -&gt;?7  mysql&gt;?SELECT?WEEK('1998-02-20',1);  -&gt;?8  mysql&gt;?SELECT?WEEK('1998-12-31',1);  -&gt;?53

注意,假如有一個(gè)日期位于前一年的最后一周, 若你不使用2、3、6或7作為mode?參數(shù)選擇,則MySQL返回?0:

mysql&gt;?SELECT?YEAR('2000-01-01'),?WEEK('2000-01-01',0);  -&gt;?2000,?0

有人或許會提出意見,認(rèn)為?MySQL?對于WEEK()?函數(shù)應(yīng)該返回?52?,原因是給定的日期實(shí)際上發(fā)生在1999年的第52周。我們決定返回0作為代替的原因是我們希望該函數(shù)能返回“給定年份的星期數(shù)”。這使得WEEK()?函數(shù)在同其它從日期中抽取日期部分的函數(shù)結(jié)合時(shí)的使用更加可靠。

假如你更希望所計(jì)算的關(guān)于年份的結(jié)果包括給定日期所在周的第一天,則應(yīng)使用?0、2、5或?7?作為mode參數(shù)選擇。

mysql&gt;?SELECT?WEEK('2000-01-01',2);  -&gt;?52  作為選擇,可使用?YEARWEEK()函數(shù):  mysql&gt;?SELECT?YEARWEEK('2000-01-01');  -&gt;?199952  mysql&gt;?SELECT?MID(YEARWEEK('2000-01-01'),5,2);  -&gt;?'52'
  • WEEKDAY(date)

返回date?(0 =?周一, 1 =?周二, … 6 =?周日)對應(yīng)的工作日索引? weekday index for

mysql&gt;?SELECT?WEEKDAY('1998-02-03?22:23:00');  -&gt;?1  mysql&gt;?SELECT?WEEKDAY('1997-11-05');  -&gt;?2
  • WEEKOFYEAR(date)

將該日期的陽歷周以數(shù)字形式返回,范圍是從1到53。它是一個(gè)兼容度函數(shù),相當(dāng)于WEEK(date,3)。

mysql&gt;?SELECT?WEEKOFYEAR('1998-02-20');  -&gt;?8
  • YEAR(date)

返回date?對應(yīng)的年份,范圍是從1000到9999。

mysql&gt;?SELECT?YEAR('98-02-03');  -&gt;?1998
  • YEARWEEK(date), YEARWEEK(date,start)

返回一個(gè)日期對應(yīng)的年或周。start參數(shù)的工作同?start參數(shù)對?WEEK()的工作相同。結(jié)果中的年份可以和該年的第一周和最后一周對應(yīng)的日期參數(shù)有所不同。

mysql>?SELECT YEARWEEK(‘1987-01-01’);

-> 198653

注意,周數(shù)和WEEK()函數(shù)隊(duì)可選參數(shù)0或?1可能會返回的(0) w有所不同,原因是此時(shí)?WEEK()?返回給定年份的語境中的周。

  • -&gt;?'1997-10-07'

?以上就是MySQL基礎(chǔ)教程9 —— 函數(shù)之日期和時(shí)間函數(shù)的內(nèi)容,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)(www.php.cn)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊7 分享