mysql中year()_MySQL year()函数

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

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;

ae8da0813708fb5ed64d55dbf427bead.png

第二个语句 -

EXPLAIN SELECT

*

FROM

dates

WHERE

dt BETWEEN '2014-01-01' and '2014-12-31';

cac384e396a43437162925364de28d5f.png

即使MySQL YEAR()函数很方便,当涉及到性能时,您应该始终考虑使用它。

在本教程中,我们向您介绍了MySQL YEAR()函数,并给出了使用它的一些示例。

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值