有時我們需要在一個日期的基礎殺那個增加某個時間長度或者減去某個時間長度,比如我們知道每個員工的出生日期,而想計算出他出生後10000填的日期,再如我們想計算所有合同到期的3個月後的日期。由於存在每個月天數不同、閏月等複雜的立法規則,所以本鞥使用簡單地數字加減發進行計算,主流的數據庫系統中都提供了對日期增減的計算下面分別進行介紹。
1. MySQL
MySQL中提供的DATE_ADD() 函數用於進行日期時間的加法運算,這個函數還有一個別名爲ADDDATE(), DATE_ADD()函數的參數格式如下:
DATE_ADD(date, INTERVAL, expr type)
其中參數date爲待計算的日期;參數expr爲待進行加法運算的增量,它可以說數值類型或者字符串類型,取決於type參數的取值;參數type則爲進行加法運算的單位。type參數可選值;參數type則爲進行加法運算的單位。type參數可選值及對應的expr參數的格式如下表所示:
Type 參數值 |
Expr 參數格式 |
說明 |
MICROSECOND |
數值類型 |
以微秒爲計算單位 |
MINUTE |
數值類型 |
以秒爲單位 |
HOUR |
數值類型 |
以小時爲單位 |
DAY |
數值類型 |
以天爲單位 |
WEEK |
數值類型 |
以周爲單位 |
MONTH |
數值類型 |
以月爲單位 |
QUARTER |
數值類型 |
以季度爲單位 |
YEAR |
數值類型 |
以年爲單位 |
HOUR_MINUTE |
字符串類型,格式爲: ‘HOURS:MINUTES’ |
以秒小時、分鐘爲計算單位,要求 expr參數必須是“小時 :分”的格式,比如“ 30:10”增加 30小時 10分鐘 |
DAY_HOUR |
字符串類型,格式爲: ‘DAYS HOURS’ |
以天、小時爲計算單位,要求 expr參數必須是“天 小時”的格式,比如“ 30 10”表示增加 30天 10小時 |
YEAR_MONTH |
字符串類型,格式爲: ‘YEARS-MONTHS’ |
以年、月爲計算單位,要求 expr參數必須是“年 -月”的格式,比如“ 2-8”表示增加 2年 8個月 |
表中前9種用法都非常簡單,比如DATE_ADD(date, INTERVAL 1 HOUR)就可以得到在日期date基礎上增加一小時後的日期時間。
下面的SQL語句用來計算每個人出生一週、兩個月及5個季度後的日期:
SELECT FBirthday,
DATE_ADD(FBirthday, INTERVAL 1 WEEK) as w1,
DATE_ADD(FBirthday, INTERVAL 2 MONTH) as m2,
DATE_ADD(FBirthday, INTERVAL 5 QUARTER) as q5
FROM T_Person
比如下面的SQL語句分別結算出生日期後3天2小時10分鐘、6個月的日期時間:
SELECT FBirthdaty, DATE_ADD(FBirthday, INTERVAL '3 2:10' DAY_MINUTE) as dm,
DATE_ADD(FBirthday, INTERVAL '1-6' YEAR_MONTH) as ym
FROM T_Person
幾乎所有版本的MySQL都支持DATE_ADD()函數的前9中用法,但是MySQL的早期版本不完全支持DATE_ADD()函數的後幾種用法,不過在MySQL的早期版本中可以嵌套調用DATE_ADD()函數來實現後幾種用法的效果。下面的SQL語句使用嵌套函數的方式來分別計算出生日期後1年6個月的日期時間:
SELECT FBirthday, DATE_ADD(DATE_ADD(FBirthday, INTERVAL 1 YEAR), INTERVAL 6 MONTH) as dm FROM T_Person
DATE_ADD()函數不僅可以用來做日期基礎上增加指定的時間段,而且還可以在日期的基礎上減少指定的時間段,只要在expr參數中使用負數就可以了。下面SQL語句用來計算每個人出生一週、兩個月及5個季度前的日期:
SELECT FBirthday, DATE_ADD(FBirthday, INTERVAL -1 WEEK) as w1, DATE_ADD(FBirthday, INTERVAL -2 MONTH) as m2, DATE_ADD(FBirthday, INTERVAL -5 QUARTER) as q5 FROM T_Person
在MySQL中提供了DATE_SUB()函數用於計算指定日期前的特定時間段的日期,期效果和在DATE_ADD()函數中使用負數的expr參數的效果一樣,其用法也和DATE_ADD()幾乎相同。下面的SQL語句用來計算每個人出生一週、兩個月及3天2小時1-分鐘前的日期:
SELECT FBirthday, DATE_SUB(FBirthday, INTERVAL 1 WEEK) as w1, DATE_SUB(FBirthday, INTERVAL 2 MONTH) as m2,DATE_SUB(FBirthday, INTERVAL '3 2:10' DAY_MINUTE) as dm FROM T_Person