mysql中year()_MySQL year()函数
在本教程中,您將學(xué)習(xí)如何使用MySQL YEAR函數(shù)從指定日期值中來獲取年份值。
MySQL YEAR函數(shù)簡介
YEAR()函數(shù)接受date參數(shù),并返回日期的年份。請參閱YEAR()函數(shù)的語法:
YEAR(date);
YEAR()函數(shù)返回一個(gè)指定日期的年份值,范圍為1000到9999,如果日期為零,YEAR()函數(shù)返回0。
以下示例返回2018-01-01日的年份,即2018。
mysql> SELECT YEAR('2018-01-01');
+--------------------+
| YEAR('2018-01-01') |
+--------------------+
| 2018 |
+--------------------+
1 row in set
以下語句返回當(dāng)前年份:
mysql> SELECT YEAR(NOW());
+-------------+
| YEAR(NOW()) |
+-------------+
| 2017 |
+-------------+
1 row in set
在本示例中,YEAR()函數(shù)返回NOW()函數(shù)提供的當(dāng)前日期和時(shí)間的年份信息。
如果日期為NULL,則YEAR()函數(shù)將返回NULL,如以下示例所示:
mysql> SELECT YEAR(NULL);
+------------+
| YEAR(NULL) |
+------------+
| NULL |
+------------+
1 row in set
如前所述,零日期的YEAR()結(jié)果為NULL(有的MySQL版本求值結(jié)果為:0):
mysql> SELECT YEAR('0000-00-00');
+--------------------+
| YEAR('0000-00-00') |
+--------------------+
| NULL |
+--------------------+
1 row in set
下面來看看看示例數(shù)據(jù)庫(yiibaidb)中的orders表。
以下查詢使用YEAR()函數(shù)來獲取每年發(fā)貨的訂單數(shù)量,如下查詢語句 -
SELECT
YEAR(shippeddate) year,
COUNT(ordernumber) orderQty
FROM
orders
WHERE
shippeddate IS NOT NULL
GROUP BY YEAR(shippeddate)
ORDER BY YEAR(shippeddate);
執(zhí)行上面查詢語句,得到以下結(jié)果 -
+------+----------+
| year | orderQty |
+------+----------+
| 2013 | 110 |
| 2014 | 147 |
| 2015 | 55 |
| 2017 | 1 |
+------+----------+
4 rows in set
在這個(gè)例子中,我們使用YEAR()函數(shù)從出貨日期中提取年度信息,并使用COUNT()函數(shù)計(jì)算已發(fā)送訂單的數(shù)量,GROUP BY子句按年份組合訂單數(shù)量。
MySQL YEAR函數(shù)和索引
目前,MySQL沒有支持函數(shù)索引。 這意味著如果在列上使用索引,表達(dá)式Y(jié)EAR(column)也不會(huì)利用索引。
了方便演示,這里創(chuàng)建一個(gè)名為dates的新表:
USE testdb;
CREATE TABLE dates (
id INT PRIMARY KEY AUTO_INCREMENT,
dt DATE
);
dt列將存儲(chǔ)日期數(shù)據(jù)。以下語句在dates表的dt列上創(chuàng)建一個(gè)索引。
CREATE INDEX idx_td ON dates(dt);
我們將在日期表中插入大量的日期數(shù)據(jù)。最簡單的方法是使用遞歸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表中的行數(shù):
SELECT
COUNT(*)
FROM
dates;
現(xiàn)在可以看到,dates表共有80354行記錄。
要獲取2014年的所有日期,請使用以下查詢:
SELECT
*
FROM
dates
WHERE
YEAR(dt) = 2014;
或者 -
SELECT
*
FROM
dates
WHERE
dt BETWEEN '2014-01-01' and '2014-12-31';
兩個(gè)查詢返回365行,這是正確的。
但是,性能方面存在差異。第一個(gè)查詢檢查日期表中的所有行和索引中的某些行,而第二個(gè)查詢中使用更快的索引。
請參閱EXPLAIN的兩個(gè)查詢:
EXPLAIN SELECT
*
FROM
dates
WHERE
YEAR(dt) = 2014;
第二個(gè)語句 -
EXPLAIN SELECT
*
FROM
dates
WHERE
dt BETWEEN '2014-01-01' and '2014-12-31';
即使MySQL YEAR()函數(shù)很方便,當(dāng)涉及到性能時(shí),您應(yīng)該始終考慮使用它。
在本教程中,我們向您介紹了MySQL YEAR()函數(shù),并給出了使用它的一些示例。
¥ 我要打賞
糾錯(cuò)/補(bǔ)充
收藏
加QQ群啦,易百教程官方技術(shù)學(xué)習(xí)群
注意:建議每個(gè)人選自己的技術(shù)方向加群,同一個(gè)QQ最多限加 3 個(gè)群。
總結(jié)
以上是生活随笔為你收集整理的mysql中year()_MySQL year()函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu添加桌面快捷方式图标
- 下一篇: 迅速把庸才变将才的七大步