实现按任意的时间统计数据

     在进行报表开发的过程中,我们经常会遇到要根据不同的时段进行统计。有的是按年,月,周,日,时,这些都比较容易实现,使用to_char函数将日期转换成对应的格式即可。如下所示按日统计。

to_char( h.row_date, 'yyyy-MM-dd' ) AS row_date2

GROUP BY  to_char( h.row_date, 'yyyy-MM-dd' )

只要对数据库表中的时间字段进行处理,to_char( h.row_date, 'yyyy-MM-dd')将其转换成如2018-05-06这种格式,然后按这种格式进行分组,即可实现按天统计。同理可得。

按月 只要将日期处理成to_char( h.row_date, 'yyyy-MM'),在按其分组统计,即可实现按月统计

按年 只要将日期处理成to_char( h.row_date, 'yyyy'),在按其分组统计,即可实现按年统计

按年 只要将时处理成to_char( h.row_date, ''yyyy-MM-dd HH24'),在按其分组统计,即可实现按小时统计

然后如果有的客户会要求比较奇葩,如按15分钟统计一次,30分钟统计一次。还有要求按任意分钟去统计的。

先讲一下按任意分钟统计,首先我们需要将日期类型的时间转换成分钟值。

如2018-09-26 16:15:00时间类型  在postgresql中转换成分钟值是25632495。

若需要按30分钟统计,我们可用上面分钟(25632495)值除以30这样会得到一个数,然后向下取整,由于每个时间除以30分钟得到不同的整数,然后根据相同的整数分组统计,即可实现按任意分钟统计。下面是按15分钟统计sql语句示例

select to_timestamp(times*60*15)::TIMESTAMP as dates,
M1,M5 from(  
SELECT floor((extract(epoch from  h.num1)-8*60*60)/60/15) times ,
sum(case when  h.tkgrp=1 then incalls else 0 end) as M1 ,
sum(case when  h.tkgrp=5 then incalls else 0 end) as M5 
from htkgrp  h where   1=1
group by  floor((extract(epoch from  h.num1)-8*60*60)/60/15)) rs
where 1=1  ORDER BY  to_timestamp(times*60*15) desc

结果集如下

我们以上sql语句进行分析floor((extract(epoch from  h.num1)-8*60*60)/60/15),重点关注这段SQL语句,

extract(epoch from  h.num1) 是时间转换成秒值,但是会存在时区差,减去8小时时间差。然后除以60得到分钟值。

除以15并向下取整得到不同的整数值,按照这些整数值分组统计,便实现按15分钟统计。然后将统计后的时间还原成时间格式to_timestamp(times*60*15)::TIMESTAMP 。

select to_timestamp(times*60*60)::TIMESTAMP as dates,
M1,M5 from(  
SELECT floor((extract(epoch from  h.num1)-8*60*60)/60/60) times ,
sum(case when  h.tkgrp=1 then incalls else 0 end) as M1 ,
sum(case when  h.tkgrp=5 then incalls else 0 end) as M5 
from htkgrp  h where   1=1
group by  floor((extract(epoch from  h.num1)-8*60*60)/60/60)) rs
where 1=1  ORDER BY  to_timestamp(times*60*60) desc

按60分钟统计

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
非常抱歉,我作为语言模型无法生成完整的代码。但是,我可以为您提供一些实现上述功能的思路和建议。 1. 首先,需要设计一个数据结构来存储影院管理系统的基本数据,并使用链表来组织这些数据。每个节点可以包含影院、电影、放映厅、票价等信息。可以定义一个结构体来表示每个节点的信息。 2. 将数据以文件的形式进行存储,可以使用文本文件(如CSV格式)或二进制文件。在读写文件时,需要注意文件打开和关闭的顺序,以及数据的输入输出格式。 3. 对文件中的数据进行读写操作,可以使用标准的文件输入输出函数(如fopen、fread、fwrite、fclose等),或者使用第三方库(如boost::iostreams)来简化操作。 4. 修改操作需要先查询到要修改的节点,然后修改节点中的数据,最后写回文件中。可以设计一个函数来处理修改操作,该函数可以接受用户输入的修改信息,并将修改后的数据写回文件。 5. 插入操作需要先查询到要插入的位置,然后在该位置前或后插入新的节点,最后写回文件中。可以设计一个函数来处理插入操作,该函数可以接受用户输入的插入信息,并将插入后的数据写回文件。 6. 删除操作需要先查询到要删除的节点,然后将该节点从链表中删除,最后写回文件中。可以设计一个函数来处理删除操作,该函数可以接受用户输入的删除信息,并将删除后的数据写回文件。 7. 查询操作可以按照不同的要求进行查询,如按照电影名称、放映时间、票价等进行查询。可以设计一个函数来处理查询操作,该函数可以接受用户输入的查询条件,并返回满足条件的节点。 8. 统计操作可以按照不同的要求进行统计,如统计某个电影的总票房收入、统计某个放映厅的座位利用率等。可以设计一个函数来处理统计操作,该函数可以接受用户输入的统计条件,并返回统计结果。 9. 排序操作可以按照不同的要求进行排序,如按照票价升序或降序排列、按照放映时间升序或降序排列等。可以设计一个函数来处理排序操作,该函数可以接受用户输入的排序条件,并返回排好序的链表。 10. 报表操作可以按照规定的格式打印数据报表,如打印某个电影的放映时间表、打印某个放映厅的座位图等。可以设计一个函数来处理报表操作,该函数可以接受用户输入的报表格式,并将数据按照格式打印出来。 11. 界面设计可以使用命令行界面或图形界面,根据用户需求进行设计。可以使用第三方库(如ncurses、Qt等)来简化界面设计。 以上是影院管理系统的一些实现思路和建议,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值