转自:https://blog.csdn.net/moakun/article/details/82528829
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
下面来看看看示例数据库(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()
函数,并给出了使用它的一些示例