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’
相關文章:
