Oracle查詢優(yōu)化改寫技巧與案例 第七章 日期運算

7.1日期類型
????????Oracle中常用的時間類型有兩個:DATE和TIMESTAMP。
????????DATE精度到秒,TIMESTAMP可以保存秒的小數(shù):
????????DATE類型相減得到的結果為整型,單位是天。
????????TIMESTAMP類型相減或TIMESTAMP與DATE相減得到的結果類型是INTERVAL。
?????????DATE和TIMESTAMP兩種類型加減一個數(shù)值得到的結果類型都是DATE:
7.2日期計算
????????如上節(jié)所述,Oracle中日期可以直接進行計算,加1就是1天,那么1/24就是1小時,分與秒的加減類似:
7.3時間間隔類型
????????如上節(jié)所述,TIMESTAMP與數(shù)值加減后得到的是DATE類型,損失了精度。如果要保留精度可以改用時間間隔類型(INTERVAL)處理,我們可以通過函數(shù)INTERVAL來得到間隔值:


????????則當前時間加一天可寫為:
????????當然,DATE類型也可以通過INTERVAL進行計算,結果類型仍為DATE:
7.4日期計算函數(shù)
????????在Oracle中,DATE類型可以直接加減天數(shù),而加減月份要用add_months函數(shù):
????????月份加減需要注意的問題:
????????如上所示,當計算上月同期時可能會重復計算28號的數(shù)據(jù)。
????????同理,計算去年同期時也會發(fā)生重復計算的現(xiàn)象,而且因四年一遇更難發(fā)現(xiàn):
????????月份加減不能使用INTERVAL類型:
????????因為沒有2018-02-29,所以此時報錯。
7.5間隔月份
????????Oracle兩個DATE相減的結果以天為單位,如果想得到間隔的月份需要使用函數(shù):
????????該函數(shù)同樣有前面提到過的計算問題,使用的時候需要注意是否影響需求:
7.6獲取記錄間的間隔時間
????????我們經常需要取記錄間的間隔時間,比如公司想知道部門20招聘員工的間隔時間。JOINE與SMITH之間的間隔就是1981.04.02-1980.12.17。
????????我們可以通過生成的序號來關聯(lián)取值:
?????也可以通過lag分析函數(shù)直接取得上一個記錄的信息:
?
????????lag和lead分別取前后的數(shù)據(jù),如果記不住可以先看執(zhí)行結果再決定用哪一個: