MySQL 获取指定时间段的年月

# 在编写存储过程时,可能会遇到通过输入的时间,得出该时间段的年月
# 下面通过试图的方式解决该问题
# 思路:
# 创建 年 、 月  的试图

# 这里创建2010~2020 年的年份
drop view if exists v_year;
CREATE VIEW v_year AS (SELECT ‘2010‘ as yearname)
UNION ALL
	(SELECT ‘2011‘)
UNION ALL
	(SELECT ‘2012‘)
UNION ALL
	(SELECT ‘2013‘)
UNION ALL
	(SELECT ‘2014‘)
UNION ALL
	(SELECT ‘2015‘)
UNION ALL
	(SELECT ‘2016‘)
UNION ALL
	(SELECT ‘2017‘)
UNION ALL
	(SELECT ‘2018‘)
UNION ALL
	(SELECT ‘2019‘)
UNION ALL
	(SELECT ‘2020‘)
;

#  创建1~12 月的月份
drop view if exists v_month;
CREATE VIEW v_month AS (SELECT ‘01‘ as monthname)
UNION ALL
	(SELECT ‘02‘)
UNION ALL
	(SELECT ‘03‘)
UNION ALL
	(SELECT ‘04‘)
UNION ALL
	(SELECT ‘05‘)
UNION ALL
	(SELECT ‘06‘)
UNION ALL
	(SELECT ‘07‘)
UNION ALL
	(SELECT ‘08‘)
UNION ALL
	(SELECT ‘09‘)
UNION ALL
	(SELECT ‘10‘)
UNION ALL
	(SELECT ‘11‘)
UNION ALL
	(SELECT ‘12‘)
;

# 将 以上创建的两个试图 作为另一个试图(包含年月的试图)的基础数据
drop view if exists v_year_month;
create view v_year_month as (
select * from v_year,v_month
);

 

# 视图 v_year_month 中 包含了2010~2020年 和对应的 1~12月 的数据 132 条

#  下面是学习中写的一个存储过程
#  其中表是按照月份创建的,例如格式为:testrecored201703 表示2017年03月的数据表
#  如果参数为 2017-05-09 11:28:27  2017-11-09 11:28:39 则 需要查询
#  testrecored201705、testrecored201706、testrecored201707、testrecored201708、testrecored201709
#  所以 需要得到201705 、 201706 、201707 、201708 、 201709 通过游标可遍历

  

drop procedure if exists pro40000;
delimiter //
create procedure pro40000(startdatetime datetime,enddatetime datetime)
begin
declare yearmonth varchar(10);
declare normhourtable varchar(50);
declare normnormtable varchar(50);
DECLARE	done INT DEFAULT FALSE;
DECLARE cursor_yearmonth CURSOR FOR
SELECT concat_ws(‘‘,yearname,monthname) as yearmonth from v_year_month
where yearname BETWEEN DATE_FORMAT(startdatetime,‘%Y‘) and DATE_FORMAT(enddatetime,‘%Y‘)
and monthname BETWEEN DATE_FORMAT(startdatetime,‘%m‘) and DATE_FORMAT(enddatetime,‘%m‘);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
TRUNCATE table t_internetsumrecord;
OPEN cursor_yearmonth;
read_loop: LOOP
FETCH cursor_yearmonth INTO yearmonth;
IF done THEN
LEAVE read_loop;
END IF;

set normhourtable = concat(‘internetsumrecord_hour‘,yearmonth);
set normnormtable = concat(‘internetsumrecord_norm_hour‘,yearmonth);
set @SQL = CONCAT(‘insert into t_internetsumrecord ‘,
‘SELECT ctinfo.NAMECN, LOGINUSERNAME,
cast(sum(case when normhour.normid=6 then normhour.normtotal else 0 end)
/sum(case when normhour.normid=6 then normhour.normcount else 0 end) as decimal(10,2)) as pingOffSetTime,
cast(sum(case when normhour.normid=171 then normhour.normtotal else 0 end)
/sum(case when normhour.normid=171 then normhour.normcount else 0 end) / 1000 as decimal(10,2)) as firstScreenTime,
cast(sum(case when normhour.normid=83 then normhour.normtotal else 0 end)
/sum(case when normhour.normid=83 then normhour.normcount else 0 end) / 1000 as decimal(10,2)) as netShowOffSetTime from ‘,normhourtable,
‘ sumrecord LEFT JOIN ‘,normnormtable,‘ normhour on normhour.SUPERID = sumrecord.ID‘,
‘ left join ctinfo on sumrecord.ctid=ctinfo.ctid where sumrecord.servicetype=‘,‘‘‘400‘‘‘,‘ and sumrecord.subservicetype=‘,‘‘‘00‘‘‘,
‘ and sumrecord.expservicetype=‘,‘‘‘0‘‘‘,‘ GROUP BY ctinfo.NAMECN,LOGINUSERNAME LIMIT ‘,0,‘,‘,20);
# SELECT @SQL;
PREPARE stms from @SQL;
EXECUTE stms;
DEALLOCATE PREPARE stms;
END LOOP;
CLOSE cursor_yearmonth; -- 关闭游标
end
//
delimiter;

  

时间: 2024-11-09 19:59:29

MySQL 获取指定时间段的年月的相关文章

mysql 获取指定日期到指定日期 区间段的日期

第一种方法: cross join (就相当于mysql中的循环) CROSS JOIN 把两张表中的数据进行 N * M的组合,即笛卡尔积 这里的两张表利用 union all都有5条数据,所以进行 cross join 后 就有25条数据 而指定的日期区间就会从这25条数据总产生 select CURDATE() - INTERVAL '1' day NOW()(获取当前日期和时间) CURDATE() (获取当前日期) CURTIME() (获取当前时间) 这里用到的是一个 INTERVA

MySQL 获取某个时间段每一天、每一个小时的统计数据

获取每一天的统计数据做项目的时候需要统对项目日志做分析,其中有一个需求是获取某个给定的时间段内,每一天的日志数据,比如说要获取从2018-02-02 09:18:36到2018-03-05 23:18:36这个时间段内,统计出每一天的日志数据,一般情况下,看到这种需求都是考虑使用函数来搞定,直接上sql语句 SELECT DATE_FORMAT(trigger_time, '%Y-%m-%d') triggerDay, COUNT(id) triggerCount FROM `job_qrtz_

mysql 行号 获取指定行数据

mysql 行号的实现 Select id,(@rowNum:[email protected]+1) as rowNo From first,(Select (@rowNum :=0) ) bOrder by first.id Desc 这样就可以实现mysql 的行号 获取指定行的数据可以使用limit 具体的使用如下: select * from first limit num,1 即可 mysql 行号 获取指定行数据,布布扣,bubuko.com

mysql查询特定时间段内的数据

SET FOREIGN_KEY_CHECKS=0; -- Table structure for t_user -- ---------------------------- DROP TABLE IF EXISTS t_user; CREATE TABLE t_user ( userId bigint(20) NOT NULL, fullName varchar(64) NOT NULL, userType varchar(16) NOT NULL, addedTime datetime NO

php 获取指定月份的开始结束时间

/** * * 获取指定年月的开始和结束时间戳 * * @param int $y 年份 * @param int $m 月份 * @return array(开始时间,结束时间) */ function mFristAndLast($y=0,$m=0){ $y = $y ? $y : date('Y'); $m = $m ? $m : date('m'); $d = date('t', strtotime($y.'-'.$m)); return array("firsttime"=&

元数据--MySQL获取元数据的方法

元数据:数据的数据,用以描述数据的信息也是数据,被称为元数据 [MySQL]获取元数据的方法 MySQL提供了以下三种方法用于获取数据库对象的元数据: 1)show语句 2)从INFORMATION_SCHEMA数据库里查询相关表(information_schema是一个虚拟数据库,并不物理存在,它储存数据的信息的数据库) 3)命令行程序,如mysqlshow, mysqldump --用SHOW语句获取元数据 MySQL用show语句获取元数据是最常用的方法,下面提供了几种典型用法: [sq

mysql取出指定范围数据limit offset分析与运用

传统写法 limit 偏移量,取出条数 SELECT * FROM yundou_management.service_order where order_status=1 order by id asc limit 108,8 ; mysql5之后支持新写法,让人更容易理解 limit 取出条数 offset 偏移量 SELECT * FROM yundou_management.service_order where order_status=1 order by id asc limit

Scala 获取指定目录下的所有文件名(不包括目录名)

最近在学习Scala,想要获取指定目录下的所有文件名,但是Scala  中有没有相应的库函数,由于本人是新手,所以弄了半天,好不容易才将网上的一段Scala 递归获取指定目录下所有目录的代码改成获取文件名,特在此备忘,也希望高手指点. 下面是一段递归获取目录名称的代码: def subdirs(dir: File): Iterator[File] = { val children = dir.listFiles.filter(_.isDirectory) children.toIterator

ORACLE获取某个时间段之间的月份列表

返回1-31,或者1-12,或者某个 select rownum   from dual   connect by rownum<31 就是connect by http://marcospring.iteye.com/blog/1721600 获取某个时间段之间的月份列表(示例返回2009-03到2010-03之间的月份列表) SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2009-03','YYYY-MM'),ROWNUM-1 ),'YYYY-MM') DAY_ID