加入收藏 | 设为首页 | 会员中心 | 我要投稿 航空爱好网 (https://www.dakongjun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL year()函数

发布时间:2022-11-23 16:14:02 所属栏目:MySql教程 来源:
导读:  MySQL YEAR函数简介

  YEAR()函数接受date参数,并返回日期的年份。请参阅YEAR()函数的语法:

  YEAR(date);
  YEAR()函数返回一个指定日期的年份值,范围为1000到9999,如果日期为零MySQL 函数,
  MySQL YEAR函数简介
 
  YEAR()函数接受date参数,并返回日期的年份。请参阅YEAR()函数的语法:
 
  YEAR(date);
  YEAR()函数返回一个指定日期的年份值,范围为1000到9999,如果日期为零MySQL 函数,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';
  即使MySQLYEAR()函数很方便,当涉及到性能时,您应该始终考虑使用它。
 
  在本教程中,我们向您介绍了MySQLYEAR()函数,并给出了使用它的一些示例。
 

(编辑:航空爱好网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!