摘要:在本教程中,您将学习如何使用 MySQL YEAR 函数从日期值中获取年份。
MySQL YEAR函数简介
YEAR()
函数接受一个日期参数并返回该日期的年份。请参阅YEAR()
函数的语法:
YEAR(date);
Code language: SQL (Structured Query Language) (sql)
YEAR()
函数返回1000
到9999
范围内的年份值。如果日期为零,则YEAR()
函数返回 0。
以下示例返回January 1st 2017
的年份,即2017
。
SELECT YEAR('2017-01-01');
+--------------------+
| YEAR('2017-01-01') |
+--------------------+
| 2017 |
+--------------------+
1 row in set (0.00 sec)
Code language: SQL (Structured Query Language) (sql)
以下语句返回当前年份:
SELECT YEAR(NOW());
+-------------+
| YEAR(NOW()) |
+-------------+
| 2017 |
+-------------+
1 row in set (0.00 sec)
Code language: SQL (Structured Query Language) (sql)
在此示例中, YEAR()
函数返回NOW()
函数提供的当前日期和时间的年份信息。
如果日期为NULL
,则YEAR()
函数将返回NULL
,如下例所示:
SELECT YEAR(NULL);
+------------+
| YEAR(NULL) |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)
Code language: SQL (Structured Query Language) (sql)
如前所述,零日期的 YEAR() 为零:
SELECT YEAR('0000-00-00');
+--------------------+
| YEAR('0000-00-00') |
+--------------------+
| 0 |
+--------------------+
1 row in set (0.00 sec)
Code language: SQL (Structured Query Language) (sql)
让我们看看示例数据库中的orders
表。
以下查询使用YEAR()
函数来获取每年发货的订单数。
SELECT
YEAR(shippeddate) year,
COUNT(ordernumber) orderQty
FROM
orders
WHERE
shippeddate IS NOT NULL
GROUP BY YEAR(shippeddate)
ORDER BY YEAR(shippeddate);
Code language: SQL (Structured Query Language) (sql)
在此示例中,我们使用YEAR()
函数从发货日期中提取年份信息,并使用COUNT()
函数计算已交付订单的数量。 GROUP BY
子句按年份对订单数进行分组。
MySQL YEAR 函数和索引
目前MySQL不支持index功能。这意味着如果索引可用于column
,则表达式YEAR(column)
将不会利用索引。
我们将创建一个名为dates
的新表用于演示目的:
CREATE TABLE dates (
id INT PRIMARY KEY AUTO_INCREMENT,
dt DATE
);
Code language: SQL (Structured Query Language) (sql)
dt
列将存储日期数据。以下语句在dates
表的dt
列上创建索引。
CREATE INDEX idx_td ON dates(dt);
Code language: SQL (Structured Query Language) (sql)
我们将在dates
表中插入大量日期。最简单的方法是使用递归 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;
Code language: SQL (Structured Query Language) (sql)
要将此日期系列插入日期表中,请使用以下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;
Code language: SQL (Structured Query Language) (sql)
您可以使用以下查询查找dates
表中的行数:
SELECT
COUNT(*)
FROM
dates;
Code language: SQL (Structured Query Language) (sql)
日期表有80354
行。
要获取 2014 年的所有日期,请使用以下查询:
SELECT
*
FROM
dates
WHERE
YEAR(dt) = 2014;
Code language: SQL (Structured Query Language) (sql)
或者
SELECT
*
FROM
dates
WHERE
dt BETWEEN '2014-01-01' and '2014-12-31';
Code language: SQL (Structured Query Language) (sql)
两个查询都返回365
行,这是正确的。
然而,在性能方面存在差异。第一个查询检查dates
表中的所有行和索引中的某些行,而第二个查询仅使用索引,速度要快得多。
请参阅两个查询的EXPLAIN
:
EXPLAIN SELECT
*
FROM
dates
WHERE
YEAR(dt) = 2014;
Code language: SQL (Structured Query Language) (sql)
和
EXPLAIN SELECT
*
FROM
dates
WHERE
dt BETWEEN '2014-01-01' and '2014-12-31';
Code language: SQL (Structured Query Language) (sql)
尽管 MySQL YEAR()
函数很方便,但在性能方面,您应该始终考虑使用它。
在本教程中,我们向您介绍了 MySQL YEAR()
函数,并为您提供了一些使用它的示例。