MySQL year()函式

2019-10-16 22:55:22

在本教學中,您將學習如何使用MySQL YEAR函式從指定日期值中來獲取年份值。

MySQL YEAR函式簡介

YEAR()函式接受date引數,並返回日期的年份。請參閱YEAR()函式的語法:

YEAR(date);

YEAR()函式返回一個指定日期的年份值,範圍為10009999,如果日期為零,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

下面來看看看範例資料庫(yiibaidb)中的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()函式,並給出了使用它的一些範例。