根据日期,按照周、月、季、年对数据进行分组统计

一、前言

带着问题去学习,我觉得是一种非常有效的学习方法,不知下面的几个问题是否也是你所需要考虑的:被分组的日期是否连续、周是以周日为起始日,还是以周一为起始日、日期跨年。在讨论日期查询的复杂性之前,我们有必要知道一些内建日期处理函数和Date/Time(日期/时间)数据类型,已经有一定了解的快速浏览下就好,直接去后半部分享用正餐。

二、内建日期处理函数

NOW() 函数

定义和用法:

NOW() 返回当前的日期和时间。

查询

select now();

结果

UNIX_TIMESTAMP() 函数

定义和用法:

1 无参数调用:UNIX_TIMESTAMP() 返回值:自'1970-01-01 00:00:00'的到当前时间的秒数差

2 有参数调用:UNIX_TIMESTAMP(date) 返回值:自'1970-01-01 00:00:00'与指定时间的秒数差

查询:

select UNIX_TIMESTAMP(), UNIX_TIMESTAMP('20180912');

结果:

DATE_FORMAT() 函数

定义和用法:

DATE_FORMAT(date,format) 函数用于以不同的格式显示日期/时间数据。

查询:

select DATE_FORMAT(NOW(),'%Y-%m-%d');

结果:

三、 Date类型

date数据类型

数据类型描述

DATE()日期。格式:YYYY-MM-DD

注释:支持的范围是从 '1000-01-01' 到 '9999-12-31'

DATETIME()*日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'

TIMESTAMP()*时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的秒数来存储。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC

TIME()时间。格式:HH:MM:SS

注释:支持的范围是从 '-838:59:59' 到 '838:59:59'

YEAR() 2 位或 4 位格式的年。

注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。

注: 即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。

在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。

TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。

format 可以使用的格式有:

格式描述

%a缩写星期名

%b缩写月名

%c月,数值

%D带有英文前缀的月中的天

%d月的天,数值(00-31)

%e月的天,数值(0-31)

%f微秒

%H小时(00-23)

%h小时(01-12)

%I小时(01-12)

%i分钟,数值(00-59)

%j年的天(001-366)

%k小时(0-23)

%l小时(1-12)

%M月名

%m月,数值(00-12)

%pAM 或 PM

%r时间,12-小时(hh:mm:ss AM 或 PM)

%S秒(00-59)

%s秒(00-59)

%T时间, 24-小时(hh:mm:ss)

%U周(00-53)星期日是一周的第一天

%u周(00-53)星期一是一周的第一天

%V周(01-53)星期日是一周的第一天,与 %X 使用

%v周(01-53)星期一是一周的第一天,与 %x 使用

%W星期名

%w周的天(0=星期日, 6=星期六)

%X年,其中的星期日是周的第一天,4 位,与 %V 使用

%x年,其中的星期一是周的第一天,4 位,与 %v 使用

%Y年,4 位

%y年,2 位

四、分组统计

说明

我们先在数据库中创建一张表

SET FOREIGN_KEY_CHECKS=0;-- ----------------------------

-- Table structure fordate_group-- ----------------------------DROP TABLE IF EXISTS `date_group`;

CREATE TABLE `date_group` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID',

`ei` bigint(20) NOT NULL,

`day` varchar(25) DEFAULT NULL COMMENT '日期',

`openPrice` decimal(25,2) DEFAULT NULL COMMENT '开盘价',

`closePrice` decimal(25,2) DEFAULT NULL COMMENT '收盘价',

`lowPrice` decimal(25,2) DEFAULT NULL COMMENT '最低价',

`higPrice` decimal(25,2) DEFAULT NULL COMMENT '最高价',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;-- ----------------------------

--Records of date_group-- ----------------------------INSERT INTO `date_group` VALUES ('1', '10001', '20161230', '10.00', '20.00', '5.00', '25.00');

INSERT INTO `date_group` VALUES ('2', '10001', '20161231', '11.00', '19.00', '6.00', '26.00');

INSERT INTO `date_group` VALUES ('3', '10001', '20170101', '12.00', '18.00', '7.00', '27.00');

INSERT INTO `date_group` VALUES ('5', '10001', '20170102', '12.00', '18.00', '7.00', '27.00');

INSERT INTO `date_group` VALUES ('6', '10001', '20170203', '13.00', '19.00', '8.00', '21.00');

INSERT INTO `date_group` VALUES ('7', '10001', '20170204', '15.00', '20.00', '9.00', '24.00');

INSERT INTO `date_group` VALUES ('8', '10001', '20170205', '13.00', '12.00', '4.00', '27.00');

INSERT INTO `date_group` VALUES ('9', '10001', '20170206', '12.00', '13.00', '5.00', '25.00');

INSERT INTO `date_group` VALUES ('10', '10001', '20180109', '14.00', '11.00', '6.00', '22.00');

INSERT INTO `date_group` VALUES ('11', '10001', '20180110', '17.00', '18.00', '8.00', '23.00');

INSERT INTO `date_group` VALUES ('12', '10001', '20180111', '19.00', '12.00', '9.00', '22.00');

INSERT INTO `date_group` VALUES ('13', '10001', '20180112', '13.00', '16.00', '2.00', '25.00');

INSERT INTO `date_group` VALUES ('14', '10001', '20180113', '11.00', '17.00', '1.00', '28.00');

INSERT INTO `date_group` VALUES ('15', '10001', '20180114', '10.00', '13.00', '8.00', '24.00');

INSERT INTO `date_group` VALUES ('16', '10002', '20161230', '15.00', '22.00', '5.00', '25.00');

INSERT INTO `date_group` VALUES ('17', '10002', '20161231', '13.00', '19.00', '6.00', '22.00');

INSERT INTO `date_group` VALUES ('18', '10002', '20170101', '12.00', '14.00', '7.00', '23.00');

INSERT INTO `date_group` VALUES ('19', '10002', '20170102', '14.00', '18.00', '7.00', '22.00');

INSERT INTO `date_group` VALUES ('20', '10002', '20170203', '17.00', '12.00', '8.00', '23.00');

INSERT INTO `date_group` VALUES ('21', '10002', '20170204', '19.00', '20.00', '9.00', '22.00');

INSERT INTO `date_group` VALUES ('22', '10002', '20170205', '13.00', '17.00', '4.00', '22.00');

INSERT INTO `date_group` VALUES ('23', '10002', '20170206', '11.00', '13.00', '6.00', '25.00');

INSERT INTO `date_group` VALUES ('24', '10002', '20180109', '10.00', '17.00', '8.00', '28.00');

INSERT INTO `date_group` VALUES ('25', '10002', '20180110', '17.00', '18.00', '7.00', '24.00');

INSERT INTO `date_group` VALUES ('26', '10002', '20180111', '19.00', '25.00', '8.00', '22.00');

INSERT INTO `date_group` VALUES ('27', '10002', '20180112', '13.00', '19.00', '9.00', '25.00');

INSERT INTO `date_group` VALUES ('28', '10002', '20180113', '15.00', '26.00', '4.00', '28.00');

INSERT INTO `date_group` VALUES ('29', '10002', '20180114', '13.00', '16.00', '5.00', '24.00');

按年分组统计

--第一种

SELECT a.ei, a.day, DATE_FORMAT(a.day,'%Y') year, SUM(a.openPrice) FROM date_group AS a GROUP BY a.ei, year;--第二种

SELECT a.ei, a.day, YEAR(a.day) year, AVG(a.closePrice) FROM date_group AS a GROUP BY a.ei, year;

按季分组统计

--第一种

SELECT a.ei, a.day, CONCAT(YEAR(a.day),FLOOR((date_format(a.day,'%m')+2)/3)) quarter, SUM(a.openPrice) FROM date_group AS a GROUP BY a.ei, quarter;--第二种

SELECT a.ei, a.day, CONCAT(YEAR(a.day),QUARTER(a.day)) quarter, AVG(a.closePrice) FROM date_group AS a GROUP BY a.ei, quarter;---------------------

按月分组统计

--第一种

SELECT a.ei, a.day, date_format(a.day,'%Y%m') month, SUM(a.openPrice) FROM date_group AS a GROUP BY a.ei, month;--第二种-- month(date)函数 和 %c 差不多,返回的是月的值(如一月为 ‘1’)

SELECT a.ei, a.day, CONCAT(YEAR(a.day),MONTH(a.day)) month, AVG(a.closePrice) FROM date_group AS a GROUP BY a.ei, month;

SELECT a.ei, a.day, date_format(a.day,'%Y%c') month, AVG(a.closePrice) FROM date_group AS a GROUP BY a.ei, month;---------------------

按周分组统计

--第一种-- 以周一为一周起始,所以20170101周日,为2016年最后一周,20170102为2017年第一周

SELECT a.ei, a.day, date_format(a.day,'%x%v') week, SUM(a.lowPrice) FROM date_group AS a GROUP BY a.ei, week;

SELECT a.ei, a.day, (UNIX_TIMESTAMP(a.day)- (if(date_format(a.day, '%w'), date_format(a.day, '%w') - 1, 6) * 86400) - 316800) / 604800week, SUM(a.lowPrice) FROM date_group AS a GROUP BY a.ei, week;--第二种--以周日为一周起始,所以20170101位2017年第一周

SELECT a.ei, a.day, date_format(a.day,'%X%V') week, SUM(a.lowPrice) FROM date_group AS a GROUP BY a.ei, week;

SELECT a.ei, a.day, (UNIX_TIMESTAMP(a.day)- date_format(a.day, '%w') * 86400 - 316800) / 604800week, SUM(a.lowPrice) FROM date_group AS a GROUP BY a.ei, week;---------------------

mysql如何按季度分组统计_MySQL中按周、月、季、年分组统计相关推荐

  1. mysql 分时统计_mysql中数据统计的技巧备忘录

    mysql 作为常用数据库,操作贼六是必须的,对于数字操作相关的东西,那是相当方便,本节就来拎几个统计案例出来供参考! order订单表,样例如下: CREATE TABLE `yyd_order` ...

  2. mysql什么情况会加意向锁_MySQL中的锁4-插入意向锁和自增锁

    插入意向锁(Insert Intention Lock) 插入意向锁本质上可以看成是一个Gap Lock 普通的Gap Lock 不允许 在 (上一条记录,本记录) 范围内插入数据 插入意向锁Gap ...

  3. mysql截取前几个字符串_mysql中截取指定字符前后的字符串

    使用SUBSTRING_INDEX()函数 substring_index(str,delim,count) str:要处理的字符串 delim:分隔符 count:分隔符计数 例子 取出上述表中数组 ...

  4. mysql将时间戳转化为天数_Mysql中如何将时间戳转化为常用日期格式

    在msyql中时间戳是一个int的数字类型,在未转换时我们无法知道它的具体日期了,下面我来给大家介绍mysql时间戳转换日期与日期转换在时间戳的方法. 存储时间戳到Mysql数据库,使用转换函数UNI ...

  5. python统计文件中每个单词出现的次数_python统计文本中每个单词出现的次数

    .python统计文本中每个单词出现的次数: #coding=utf-8 __author__ = 'zcg' import collections import os with open('abc. ...

  6. mysql横纵分组统计_MySQL中如何实现分组统计

    首先准备四张表A.B.C.D, -------------------------------- A      | B | C   | D a   b   |   a   c   |   a   d  ...

  7. mysql两个字段相减_MySQL 中NULL和空值的区别?

    作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值.那你知道它们有什么区别吗? 学不动了,也不想知道它们有什么区别.大兄弟,不行啊,要面试! 前些天我 ...

  8. mysql的where字句调优_mysql中select和where子句优化的总结

    本篇文章给大家带来的内容是关于mysql中select和where子句优化的总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 数据库优化: 1.可以在单个SQL语句,整个应用程序, ...

  9. mysql中和compute同等作用的_MYSQL中Group By的原理和用法

    合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...

最新文章

  1. 你认识的世界与客观世界间差了N光年
  2. AI现在能教你画画了
  3. 成电计算机学院保研率,985一条街的街友们,我就想问问电子科技大学(成电)到底是什么水平的学校啊!...
  4. P3538-[POI2012]OKR-A Horrible Poem【hash,字符串】
  5. 【java】java 并发编程 ArrayBlockingQueue
  6. Linux环境下NodeJS和MongoDB的安装配置
  7. Android精品开源项目整理_V20140221(持续更新中..)
  8. 22. SCHEMA_PRIVILEGES
  9. 堆载预压弹性变形怎样计算公式_支架载荷计算公式
  10. 山重水复疑无路 柳暗花明又一村
  11. ubuntu18 防火墙关闭_ubuntu18开启/关闭防火墙
  12. poj 2536 Gopher II
  13. 百度云下载不限速方法合集
  14. _tsplitpath_s(分解路径)
  15. 运行uni-app报错:sitemap.json Error: 未找到入口 sitemap.json 文件
  16. 吐槽智能手机上那些不爽的事
  17. caffe中的layer
  18. 【数据结构】线性表的应用:稀疏一元多项式运算器
  19. wireshark抓包测试:海康摄像机
  20. JAVA LocalDateTime 获取当前年份的开始时间和去年开始时间

热门文章

  1. 织梦 详情页 php,织梦dedecms内页、详情页中调用文章发布者信息的方法
  2. 如何做好app的测试工作?
  3. ros下Kinect的“跟屁虫”
  4. 网络安全 payload、shellcode、exp、poc
  5. 【五一特刊】FPGA零基础学习:SDR SDRAM 驱动设计
  6. 大容量硬盘的应用是计算机的,5大软件伤硬盘
  7. STC15 - C51 - Memory Models
  8. 计算机网络应用二维动画,【单选题】二维动画属于计算机动画系统的第______级。 A. 一 B. 二 C. 三 D. 四...
  9. 数据分析专题报告范文6篇_专题报告格式及范文(共6篇).doc
  10. 成都市发布大数据产业发展规划 2025年产值达到3000亿元