MySQL date_sub()函式

2019-10-16 22:55:05

在本教學中,您將學習如何使用MySQL DATE_SUB()函式從日期中減去時間值。

MySQL DATE_SUB函式簡介

DATE_SUB()函式從DATEDATETIME值中減去時間值(或間隔)。 下面說明了DATE_SUB()函式的語法:

DATE_SUB(start_date,INTERVAL expr unit);

DATE_SUB()函式接受兩個引數:

  • start_dateDATEDATETIME的起始值。
  • expr是一個字串,用於確定從起始日期減去的間隔值。unitexpr可解析的間隔單位,例如DAYHOUR

以下語句使用DATE_SUB()函式從2017年7月4日減去1天:

mysql> SELECT DATE_SUB('2017-09-04',INTERVAL 1 DAY) result;
+------------+
| result     |
+------------+
| 2017-09-03 |
+------------+
1 row in set
-- 求昨天的日期值: 將今天的日期值減去 1 天
mysql> SELECT DATE_SUB(curdate(),INTERVAL 1 DAY) result;
+------------+
| result     |
+------------+
| 2017-08-09 |
+------------+
1 row in set

在這個例子中,開始日期是2017-09-04,它是yyyy-mm-dd格式。 INTERVAL 1 DAY被解析為1天的時間間隔。DATE_SUB()函式的結果是2017-09-03的字串值。

類似於DATE_ADD()函式,DATE_SUB()函式的返回值的資料型別可以是:

  • 如果第一個引數是DATETIME,則返回值應為DATETIME,或者該間隔具有時間元素,如小時,分鐘,秒等。
  • 否則返回一個字串。

請參閱以下範例:

範例-1

mysql> SELECT DATE_SUB('2017-09-04',INTERVAL 3 HOUR) result;
+---------------------+
| result              |
+---------------------+
| 2017-09-03 21:00:00 |
+---------------------+
1 row in set

因為間隔為3小時,DATE_SUB函式的結果為DATETIME值。

範例-2 MySQL DATE_SUB:負間隔值

expr在間隔值可以為正或負數值。 如果expr為負數,則DATE_SUB()函式的行為與DATE_ADD()函式類似,如下例所示:

mysql> SELECT DATE_SUB('2017-07-03',INTERVAL -1 DAY) result;
+------------+
| result     |
+------------+
| 2017-07-04 |
+------------+
1 row in set

範例-3 MySQL DATE_SUB:無效或格式錯誤的日期
如果DATE_SUB()函式的第一個引數格式錯誤,日期無效或NULL,則DATE_SUB()函式返回NULL

mysql> SELECT DATE_SUB('2017-02-29', INTERVAL - 1 DAY) result;
+--------+
| result |
+--------+
| NULL   |
+--------+
1 row in set

在這個例子中,2017-02-29是一個無效的日期,因此結果為NULL。 此外,MySQL發出警告,可通過以下查詢檢視語句。

mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1292 | Incorrect datetime value: '2017-02-29' |
+---------+------+----------------------------------------+
1 row in set

以下範例演示了將異常日期或NULL傳遞給DATE_SUB函式,效果如下所示:

mysql> SELECT DATE_SUB('03/07/2017', INTERVAL 1 DAY) result;
+--------+
| result |
+--------+
| NULL   |
+--------+
1 row in set

mysql> SELECT DATE_SUB(NULL, INTERVAL 1 DAY) result;
+--------+
| result |
+--------+
| NULL   |
+--------+
1 row in set

範例-3 MySQL DATE_SUB:自動調整日

如果從最大日期的日期減去MONTHYEARYEAR_MONTH的間隔,則該日期將被調整為新月份的最大日期。

下面來看看以下語句:

mysql> SELECT DATE_SUB('2017-03-30', INTERVAL 1 MONTH) result;
+------------+
| result     |
+------------+
| 2017-02-28 |
+------------+
1 row in set

在這個例子中,我們從2017年3月30日起減去1個月,結果是2017年2月28日。這一天被調整到28日而不是30日,因為2017年2月份只有28天。

在本教學中,您已經學習了如何使用MySQL DATE_SUB()函式從DATEDATETIME值中減去時間間隔。