zoukankan      html  css  js  c++  java
  • MySQL year()函数

    转自:https://blog.csdn.net/moakun/article/details/82528829

    MySQL YEAR函数简介

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

    YEAR(date);
    

    YEAR()函数返回一个指定日期的年份值,范围为10009999,如果日期为零,YEAR()函数返回0

    以下示例返回2018-01-01日的年份,即2018

    1.  
      mysql> SELECT YEAR('2018-01-01');
    2.  
      +--------------------+
    3.  
      | YEAR('2018-01-01') |
    4.  
      +--------------------+
    5.  
      | 2018 |
    6.  
      +--------------------+
    7.  
      1 row in set

    以下语句返回当前年份:

    1.  
      mysql> SELECT YEAR(NOW());
    2.  
      +-------------+
    3.  
      | YEAR(NOW()) |
    4.  
      +-------------+
    5.  
      | 2017 |
    6.  
      +-------------+
    7.  
      1 row in set

    在本示例中,YEAR()函数返回NOW()函数提供的当前日期和时间的年份信息。

    如果日期为NULL,则YEAR()函数将返回NULL,如以下示例所示:

    1.  
      mysql> SELECT YEAR(NULL);
    2.  
      +------------+
    3.  
      | YEAR(NULL) |
    4.  
      +------------+
    5.  
      | NULL |
    6.  
      +------------+
    7.  
      1 row in set

    如前所述,零日期的YEAR()结果为NULL(有的MySQL版本求值结果为:0):

    1.  
      mysql> SELECT YEAR('0000-00-00');
    2.  
      +--------------------+
    3.  
      | YEAR('0000-00-00') |
    4.  
      +--------------------+
    5.  
      | NULL |
    6.  
      +--------------------+
    7.  
      1 row in set

    下面来看看看示例数据库(yiibaidb)中的orders表。

    以下查询使用YEAR()函数来获取每年发货的订单数量,如下查询语句 -

    1.  
      SELECT
    2.  
      YEAR(shippeddate) year,
    3.  
      COUNT(ordernumber) orderQty
    4.  
      FROM
    5.  
      orders
    6.  
      WHERE
    7.  
      shippeddate IS NOT NULL
    8.  
      GROUP BY YEAR(shippeddate)
    9.  
      ORDER BY YEAR(shippeddate);

    执行上面查询语句,得到以下结果 -

    1.  
      +------+----------+
    2.  
      | year | orderQty |
    3.  
      +------+----------+
    4.  
      | 2013 | 110 |
    5.  
      | 2014 | 147 |
    6.  
      | 2015 | 55 |
    7.  
      | 2017 | 1 |
    8.  
      +------+----------+
    9.  
      4 rows in set
    10.  
       

    在这个例子中,我们使用YEAR()函数从出货日期中提取年度信息,并使用COUNT()函数计算已发送订单的数量,GROUP BY子句按年份组合订单数量。

    MySQL YEAR函数和索引

    目前,MySQL没有支持函数索引。 这意味着如果在列上使用索引,表达式YEAR(column)也不会利用索引。

    了方便演示,这里创建一个名为dates的新表:

    1.  
      USE testdb;
    2.  
      CREATE TABLE dates (
    3.  
      id INT PRIMARY KEY AUTO_INCREMENT,
    4.  
      dt DATE
    5.  
      );

    dt列将存储日期数据。以下语句在dates表的dt列上创建一个索引

    CREATE INDEX idx_td ON dates(dt);
    

    我们将在日期表中插入大量的日期数据。最简单的方法是使用递归CTE生成日期序列,并将此日期序列插入到dates表中。

    以下递归CTE生成“1800-01-01”“2020-12-31”之间的日期:

    1.  
      WITH RECURSIVE dates (dt) AS
    2.  
      (
    3.  
      SELECT '1800-01-01'
    4.  
      UNION ALL
    5.  
      SELECT dt + INTERVAL 1 DAY FROM dates
    6.  
      WHERE dt + INTERVAL 1 DAY <= '2020-12-31'
    7.  
      )
    8.  
      SELECT dt FROM dates;

    要将此日期序列插入到dates表中,请使用以下INSERT语句:

    1.  
      INSERT INTO dates(dt)
    2.  
      WITH RECURSIVE dates (dt) AS
    3.  
      (
    4.  
      SELECT '1800-01-01'
    5.  
      UNION ALL
    6.  
      SELECT dt + INTERVAL 1 DAY FROM dates
    7.  
      WHERE dt + INTERVAL 1 DAY <= '2020-01-01'
    8.  
      )
    9.  
      SELECT dt FROM dates;

    您可以使用以下查询查找orders表中的行数:

    1.  
      SELECT
    2.  
      COUNT(*)
    3.  
      FROM
    4.  
      dates;

    现在可以看到,dates表共有80354行记录。

    要获取2014年的所有日期,请使用以下查询:

    1.  
      SELECT
    2.  
      *
    3.  
      FROM
    4.  
      dates
    5.  
      WHERE
    6.  
      YEAR(dt) = 2014;

    或者 -

    1.  
      SELECT
    2.  
      *
    3.  
      FROM
    4.  
      dates
    5.  
      WHERE
    6.  
      dt BETWEEN '2014-01-01' and '2014-12-31';

    两个查询返回365行,这是正确的。

    但是,性能方面存在差异。第一个查询检查日期表中的所有行和索引中的某些行,而第二个查询中使用更快的索引。

    请参阅EXPLAIN的两个查询:

    1.  
      EXPLAIN SELECT
    2.  
      *
    3.  
      FROM
    4.  
      dates
    5.  
      WHERE
    6.  
      YEAR(dt) = 2014;

    第二个语句 -

    1.  
      EXPLAIN SELECT
    2.  
      *
    3.  
      FROM
    4.  
      dates
    5.  
      WHERE
    6.  
      dt BETWEEN '2014-01-01' and '2014-12-31';

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

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

  • 相关阅读:
    HDU 1025 Constructing Roads In JGShining's Kingdom (DP+二分)
    HDU 1158 Employment Planning
    HDU 2059 龟兔赛跑
    Csharp 简单操作Word模板文件
    Csharp windowform datagridview Clipboard TO EXCEL OR FROM EXCEL DATA 保存datagridview所有數據
    Csharp 讀寫文件內容搜索自動彈出 AutoCompleteMode
    Csharp windowform controls clear
    CSS DIV大图片右上角叠加小图片
    Csharp DataGridView自定义添加DateTimePicker控件日期列
    Csharp 打印Word文件默認打印機或選擇打印機設置代碼
  • 原文地址:https://www.cnblogs.com/sharpest/p/13709697.html
Copyright © 2011-2022 走看看