MySQL YEAR函数

时间:2019-11-20 08:52:24  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用MySQL YEAR函数从日期值中获取年份。

MySQL YEAR函数简介

YEAR()函数采用日期参数,并返回日期的年份。
请参见YEAR()函数的语法:

YEAR(date);

YEAR()函数返回的年份值在1000到9999之间。
如果日期为零,则YEAR()函数返回0。

以下示例返回2017年1月1日这一年。

SELECT YEAR('2017-01-01');

+--------------------+
| YEAR('2017-01-01') |
+--------------------+
|               2017 |
+--------------------+
1 row in set (0.00 sec)

以下语句返回当前年份:

SELECT YEAR(NOW());
+-------------+
| YEAR(NOW()) |
+-------------+
|        2017 |
+-------------+
1 row in set (0.00 sec)

在此示例中,YEAR()函数返回由NOW()函数提供的当前日期和时间的年份信息。

如果日期为NULL,则YEAR()函数将返回NULL,如以下示例所示:

SELECT YEAR(NULL);
+------------+
| YEAR(NULL) |
+------------+
|       NULL |
+------------+
1 row in set (0.00 sec)

如前所述,零日期的YEAR()为零:

SELECT YEAR('0000-00-00');
+--------------------+
| YEAR('0000-00-00') |
+--------------------+
|                  0 |
+--------------------+
1 row in set (0.00 sec)

让我们看看示例数据库中的订单表。

以下查询使用YEAR()函数获取每年发货的订单数。

SELECT 
    YEAR(shippeddate) year, 
    COUNT(ordernumber) orderQty
FROM 
    orders
WHERE
    shippeddate IS NOT NULL
GROUP BY YEAR(shippeddate)
ORDER BY YEAR(shippeddate);

在此示例中,我们使用YEAR()函数从发货日期中提取年份信息,并使用COUNT()函数计算已交付订单的数量。
GROUP BY子句按年份对订单数进行分组。

MySQL YEAR函数和索引

目前,MySQL不支持函数索引。
这意味着如果索引可用于列,则表达式YEAR(column)将不会利用索引。

我们将创建一个名为dates的新表用于演示:

CREATE TABLE dates (
    id INT PRIMARY KEY AUTO_INCREMENT,
    dt DATE
);

dt列将存储日期数据。
以下语句在日期表的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;

要将此日期系列插入日期表,请使用以下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;

您可以使用以下查询在日期表中找到行数:

SELECT 
    COUNT(*)
FROM
    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 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()函数,并提供了一些使用它的示例。