MySQL year()函數


轉自:https://blog.csdn.net/moakun/article/details/82528829

MySQL YEAR函數簡介

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

YEAR(date);

YEAR()函數返回一個指定日期的年份值,范圍為10009999,如果日期為零,YEAR()函數返回0

以下示例返回2018-01-01日的年份,即2018

  1.  
    mysql> SELECT YEAR('2018-01-01');
  2.  
    + --------------------+
  3.  
    | YEAR('2018-01-01') |
  4.  
    + --------------------+
  5.  
    | 2018 |
  6.  
    + --------------------+
  7.  
    1 row in set

以下語句返回當前年份:

  1.  
    mysql> SELECT YEAR(NOW());
  2.  
    + -------------+
  3.  
    | YEAR(NOW()) |
  4.  
    + -------------+
  5.  
    | 2017 |
  6.  
    + -------------+
  7.  
    1 row in set

在本示例中,YEAR()函數返回NOW()函數提供的當前日期和時間的年份信息。

如果日期為NULL,則YEAR()函數將返回NULL,如以下示例所示:

  1.  
    mysql> SELECT YEAR(NULL);
  2.  
    + ------------+
  3.  
    | YEAR(NULL) |
  4.  
    + ------------+
  5.  
    | NULL |
  6.  
    + ------------+
  7.  
    1 row in set

如前所述,零日期的YEAR()結果為NULL(有的MySQL版本求值結果為:0):

  1.  
    mysql> SELECT YEAR('0000-00-00');
  2.  
    + --------------------+
  3.  
    | YEAR('0000-00-00') |
  4.  
    + --------------------+
  5.  
    | NULL |
  6.  
    + --------------------+
  7.  
    1 row in set

下面來看看看示例數據庫(yiibaidb)中的orders表。

以下查詢使用YEAR()函數來獲取每年發貨的訂單數量,如下查詢語句 -

  1.  
    SELECT
  2.  
    YEAR(shippeddate) year,
  3.  
    COUNT(ordernumber) orderQty
  4.  
    FROM
  5.  
    orders
  6.  
    WHERE
  7.  
    shippeddate IS NOT NULL
  8.  
    GROUP BY YEAR(shippeddate)
  9.  
    ORDER BY YEAR(shippeddate);

執行上面查詢語句,得到以下結果 -

  1.  
    +------+----------+
  2.  
    | year | orderQty |
  3.  
    +------+----------+
  4.  
    | 2013 | 110 |
  5.  
    | 2014 | 147 |
  6.  
    | 2015 | 55 |
  7.  
    | 2017 | 1 |
  8.  
    +------+----------+
  9.  
    4 rows in set
  10.  
     

在這個例子中,我們使用YEAR()函數從出貨日期中提取年度信息,並使用COUNT()函數計算已發送訂單的數量,GROUP BY子句按年份組合訂單數量。

MySQL YEAR函數和索引

目前,MySQL沒有支持函數索引。 這意味着如果在列上使用索引,表達式YEAR(column)也不會利用索引。

了方便演示,這里創建一個名為dates的新表:

  1.  
    USE testdb;
  2.  
    CREATE TABLE dates (
  3.  
    id INT PRIMARY KEY AUTO_INCREMENT,
  4.  
    dt DATE
  5.  
    );

dt列將存儲日期數據。以下語句在dates表的dt列上創建一個索引

CREATE INDEX idx_td ON dates(dt); 

我們將在日期表中插入大量的日期數據。最簡單的方法是使用遞歸CTE生成日期序列,並將此日期序列插入到dates表中。

以下遞歸CTE生成“1800-01-01”“2020-12-31”之間的日期:

  1.  
    WITH RECURSIVE dates (dt) AS
  2.  
    (
  3.  
    SELECT '1800-01-01'
  4.  
    UNION ALL
  5.  
    SELECT dt + INTERVAL 1 DAY FROM dates
  6.  
    WHERE dt + INTERVAL 1 DAY <= '2020-12-31'
  7.  
    )
  8.  
    SELECT dt FROM dates;

要將此日期序列插入到dates表中,請使用以下INSERT語句:

  1.  
    INSERT INTO dates(dt)
  2.  
    WITH RECURSIVE dates (dt) AS
  3.  
    (
  4.  
    SELECT '1800-01-01'
  5.  
    UNION ALL
  6.  
    SELECT dt + INTERVAL 1 DAY FROM dates
  7.  
    WHERE dt + INTERVAL 1 DAY <= '2020-01-01'
  8.  
    )
  9.  
    SELECT dt FROM dates;

您可以使用以下查詢查找orders表中的行數:

  1.  
    SELECT
  2.  
    COUNT(*)
  3.  
    FROM
  4.  
    dates;

現在可以看到,dates表共有80354行記錄。

要獲取2014年的所有日期,請使用以下查詢:

  1.  
    SELECT
  2.  
    *
  3.  
    FROM
  4.  
    dates
  5.  
    WHERE
  6.  
    YEAR(dt) = 2014;

或者 -

  1.  
    SELECT
  2.  
    *
  3.  
    FROM
  4.  
    dates
  5.  
    WHERE
  6.  
    dt BETWEEN '2014-01-01' and '2014-12-31';

兩個查詢返回365行,這是正確的。

但是,性能方面存在差異。第一個查詢檢查日期表中的所有行和索引中的某些行,而第二個查詢中使用更快的索引。

請參閱EXPLAIN的兩個查詢:

  1.  
    EXPLAIN SELECT
  2.  
    *
  3.  
    FROM
  4.  
    dates
  5.  
    WHERE
  6.  
    YEAR(dt) = 2014;

第二個語句 -

  1.  
    EXPLAIN SELECT
  2.  
    *
  3.  
    FROM
  4.  
    dates
  5.  
    WHERE
  6.  
    dt BETWEEN '2014-01-01' and '2014-12-31';

即使MySQL YEAR()函數很方便,當涉及到性能時,您應該始終考慮使用它。

在本教程中,我們向您介紹了MySQL YEAR()函數,並給出了使用它的一些示例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM