日期和時(shí)間處理函數(shù)
日期和時(shí)間才用相應(yīng)的數(shù)據(jù)類型和特殊的格式存儲(chǔ),以便能快速和有效地排序或過濾,并且節(jié)省物理存儲(chǔ)空間。
一般,應(yīng)用程序不使用用來存儲(chǔ)日期和時(shí)間的格式,因此日期和時(shí)間函數(shù)總是被用來讀取、和處理這些值。由于這個(gè)原因,日期和時(shí)間函數(shù)在MySQL語(yǔ)言中具有重要的作用。
下表列出了某些常用的日期和時(shí)間處理函數(shù):
這是重新復(fù)習(xí)有where進(jìn)行數(shù)據(jù)過濾的一個(gè)好時(shí)機(jī)。迄今為止,我們都是用比較數(shù)值和文本的where子句過濾數(shù)據(jù),但數(shù)據(jù)經(jīng)常需要用日期進(jìn)行過濾。用日期進(jìn)行過濾需要注意一些別的問題和使用特殊的MySQL函數(shù)。
首先需要注意的是MySQL使用的日期格式。無論你什么時(shí)候指定一個(gè)日期,不管是插入或更新表值還是用where子句進(jìn)行過濾,日期必須為格式y(tǒng)yyy-mm-dd。因此,2005年9月1日,給出為2005-09-01.雖然其他的日期格式可能也行,但這是首選的日期格式,因?yàn)樗懦硕嗔x性(如,04/05/06是2006年5月4日或2006年4月5日或2004年5月6日或…)。
應(yīng)該總是使用4位數(shù)字的年份,支持2位數(shù)字的年份,MySQL處理00-69為2000-2069,處理70-99為1970-1999。雖然它們可能是打算要的年份,但使用完整的4為數(shù)字年份更可靠,因?yàn)镸ySQL不必做出任何假定。
因此,基本的日期比較應(yīng)該很簡(jiǎn)單:
輸入:
select?cust_id,order_num?from?orders?where?order_date?=?'2005-09-01';
輸出:
分析:此select語(yǔ)句正常運(yùn)行。它檢索出一個(gè)訂單記錄,該訂單記錄的order_date為2005-09-01。
但是,使用 where order_date = ‘2005-09-01’可靠嗎? order_date的數(shù)據(jù)類型為datetime。這種類型存儲(chǔ)日期及時(shí)間值。樣例表中的值全都具有時(shí)間值00:00:00,但實(shí)際中很肯能并不總是這樣。如果用當(dāng)前日期和時(shí)間存儲(chǔ)訂單日期,怎么辦?比如,存儲(chǔ)的 order_date值為2005-09-01 11:30:05,則where order_date = ‘2005-09-01’失敗。即使給出具有該日期的一行,也不會(huì)把它檢索出來,因?yàn)閣here匹配失敗。
解決辦法是指示MySQL僅將給出的日期與列中的日期部分進(jìn)行比較,而不是將給出的日期與整個(gè)列值進(jìn)行比較。為此,必須使用date()函數(shù)。Date(order_date)指示MySQL僅提取列的日期部分,更可靠的select語(yǔ)句為:
輸入:
select?cust_id,order_num?from?orders?where?Date(order_date)?=?'2005-09-01';
如果你想要的僅僅是日期,那么使用Date()是一個(gè)良好的習(xí)慣,,即使你知道相應(yīng)的列只包含日期也是如此。這樣,如果由于某種原因表中以后有日期和時(shí)間值,你的SQL代碼也不用改變。當(dāng)然,也存在一個(gè)Time()函數(shù),在你只想要時(shí)間時(shí),應(yīng)該使用它。
Date()和Time()都是在MySQL4.1.1中第一次引入的。
在你知道了如何用日期進(jìn)行相等測(cè)試后,其他操作符的使用也就很清楚了。
不過,還有一種日期比較需要說明。如果你想檢索出2005年9月下的所有訂單,怎么辦?簡(jiǎn)單的相等測(cè)試不行,因?yàn)樗惨ヅ湓路葜械奶鞌?shù)。有幾種解決辦法,其中之一如下所示:
輸入:
select?cust_id,order_num?from?orders?where?Date(order_date)?between?'2005-09-01'?and??'2005-09-30';
輸出:
分析:其中,between操作符用來把2005-09-01和2005-09-30定義為一個(gè)要匹配的日期范圍。
數(shù)值處理函數(shù)
數(shù)值處理函數(shù)僅處理數(shù)值數(shù)據(jù)。這些函數(shù)一般主要用于代數(shù)、三角或幾何運(yùn)算,因此沒有串或者日期-時(shí)間處理函數(shù)使用的那么頻繁。
具有諷刺意味的是,在主要DBMS的函數(shù)中,數(shù)值函數(shù)是最一直最統(tǒng)一的函數(shù)。下表列出一些常用的數(shù)值處理函數(shù):