在本教學中,您將學習如何使用MySQL YEAR
函數從指定日期值中來獲取年份值。
MySQL YEAR函數簡介
YEAR()
函數接受date
參數,並返回日期的年份。請參閱YEAR()
函數的語法:
YEAR(date);
YEAR()
函數返回一個指定日期的年份值,範圍為1000
到9999
,如果日期為零,YEAR()
函數返回0
。
以下示例返回2018-01-01日
的年份,即2018
。
mysql> SELECT YEAR('2018-01-01');
+--------------------+
| YEAR('2018-01-01') |
+--------------------+
| 2018 |
+--------------------+
1 row in set
以下語句返回當前年份:
mysql> SELECT YEAR(NOW());
+-------------+
| YEAR(NOW()) |
+-------------+
| 2017 |
+-------------+
1 row in set
在本示例中,YEAR()
函數返回NOW()
函數提供的當前日期和時間的年份資訊。
如果日期為NULL
,則YEAR()
函數將返回NULL
,如以下示例所示:
mysql> SELECT YEAR(NULL);
+------------+
| YEAR(NULL) |
+------------+
| NULL |
+------------+
1 row in set
如前所述,零日期的YEAR()
結果為NULL
(有的MySQL版本求值結果為:0
):
mysql> SELECT YEAR('0000-00-00');
+--------------------+
| YEAR('0000-00-00') |
+--------------------+
| NULL |
+--------------------+
1 row in set
下麵來看看看示例資料庫(zaixiandb)中的orders
表。
以下查詢使用YEAR()
函數來獲取每年發貨的訂單數量,如下查詢語句 -
SELECT
YEAR(shippeddate) year,
COUNT(ordernumber) orderQty
FROM
orders
WHERE
shippeddate IS NOT NULL
GROUP BY YEAR(shippeddate)
ORDER BY YEAR(shippeddate);
執行上面查詢語句,得到以下結果 -
+------+----------+
| year | orderQty |
+------+----------+
| 2013 | 110 |
| 2014 | 147 |
| 2015 | 55 |
| 2017 | 1 |
+------+----------+
4 rows in set
在這個例子中,我們使用YEAR()
函數從出貨日期中提取年度資訊,並使用COUNT()
函數計算已發送訂單的數量,GROUP BY
子句按年份組合訂單數量。
MySQL YEAR函數和索引
目前,MySQL沒有支持函數索引。 這意味著如果在列上使用索引,運算式YEAR(column)
也不會利用索引。
了方便演示,這裏創建一個名為dates
的新表:
USE testdb;
CREATE TABLE dates (
id INT PRIMARY KEY AUTO_INCREMENT,
dt DATE
);
dt
列將存儲日期數據。以下語句在dates
表的dt
列上創建一個索引。
CREATE INDEX idx_td ON dates(dt);
我們將在日期表中插入大量的日期數據。最簡單的方法是使用遞歸CTE生成日期序列,並將此日期序列插入到dates
表中。
以下遞歸CTE
生成“1800-01-01”
和“2020-12-31”
之間的日期:
WITH RECURSIVE dates (dt) AS
(
SELECT '1800-01-01'
UNION ALL
SELECT dt + INTERVAL 1 DAY FROM dates
WHERE dt + INTERVAL 1 DAY <= '2020-12-31'
)
SELECT dt FROM dates;
要將此日期序列插入到dates
表中,請使用以下INSERT語句:
INSERT INTO dates(dt)
WITH RECURSIVE dates (dt) AS
(
SELECT '1800-01-01'
UNION ALL
SELECT dt + INTERVAL 1 DAY FROM dates
WHERE dt + INTERVAL 1 DAY <= '2020-01-01'
)
SELECT dt FROM dates;
您可以使用以下查詢查找orders
表中的行數:
SELECT
COUNT(*)
FROM
dates;
現在可以看到,dates
表共有80354
行記錄。
要獲取2014
年的所有日期,請使用以下查詢:
SELECT
*
FROM
dates
WHERE
YEAR(dt) = 2014;
或者 -
SELECT
*
FROM
dates
WHERE
dt BETWEEN '2014-01-01' and '2014-12-31';
兩個查詢返回365
行,這是正確的。
但是,性能方面存在差異。第一個查詢檢查日期表中的所有行和索引中的某些行,而第二個查詢中使用更快的索引。
請參閱EXPLAIN
的兩個查詢:
EXPLAIN SELECT
*
FROM
dates
WHERE
YEAR(dt) = 2014;
第二個語句 -
EXPLAIN SELECT
*
FROM
dates
WHERE
dt BETWEEN '2014-01-01' and '2014-12-31';
即使MySQL YEAR()
函數很方便,當涉及到性能時,您應該始終考慮使用它。
在本教學中,我們向您介紹了MySQL YEAR()
函數,並給出了使用它的一些示例。