sqlserver/mysql按天、按小时、按分钟统计连续时间段数据

一,写在前面的话

最近公司需要按天,按小时查看数据,可以直观的看到时间段的数据峰值。接到需求,就开始疯狂百度搜索,但是搜索到的资料有很多都不清楚,需要自己去总结和挖掘其中的重要信息。现在我把分享出来了呢,希望大家喜欢。

针对sqlserver, 有几点需要给大家说清楚(不懂的自行百度):

•master..spt_values 是什么东西?能用来做什么?
•如何产生连续的时间段(年, 月, 天,小时,分钟)

二,master..spt_values是什么东西?能用来做什么呢?

相对固定通用的取数字的表,主要作用就是取连续数字,不过有个缺陷就是只能取到2047。可以执行下面语句就知道什么意思了。

select number from master..spt_values where type='p'

三,如何产生连续的时间段(年, 月, 天,小时,分钟)

在实际的运用中,目前主要是产生连续的时间段。我准备了常用的操作,那下面的语句就分别展示出来。

-- 按年产生连续的
SELECT
 substring(CONVERT(NVARCHAR(10), DateAdd(YEAR, number, '2016-01-01'),120),1,4) AS GroupDay,type
FROM
 master..spt_values
WHERE type = 'p' AND number <= DateDiff(YEAR, '2016-01-01', '2019-01-01')
-- 按月产生连续的
SELECT
 substring(CONVERT(NVARCHAR(10), DateAdd(MONTH, number, '2019-01-01'),120),1,7) AS GroupDay,type
FROM
 master..spt_values
WHERE type = 'p' AND number <= DateDiff(MONTH, '2018-01-01', '2019-01-01')
-- 按天产生连续的
SELECT
 CONVERT(NVARCHAR(10), DateAdd(day, number, '2019-01-01'),120) AS GroupDay,type
FROM
 master..spt_values
WHERE type = 'p' AND number <= DateDiff(day, '2019-01-01', '2019-01-18')
-- 按小时产生连续的
SELECT
 substring(convert(char(32),DATEADD(HH,number,CONCAT('2019-01-18',' ', '00:00')),120),1,16) AS GroupDay,type
FROM
 master..spt_values
WHERE type = 'p' AND DATEDIFF(HH,DATEADD(HH,number,CONCAT('2019-01-18',' ', '00:00')),CONCAT('2019-01-18',' ', '23:00'))>=0
-- 按分钟的就自己可以YY了
......

四,与业务场景进行结合

有了连续的数据过后,当然就是以时间为主,进行左连接。就可以查出统计数据了。

下面我就说说我使用的两个统计案例(是采用存储过程来实现了,所以有@符号的是变量),给到大家,至于看不看得懂,就看你的能力了。

-- 按天统计交易笔数
select a.GroupDay, ISNULL(b.e, 0) 'feeCount' from (
      SELECT
        CONVERT(NVARCHAR(10), DateAdd(day, number, @paySdate),120) AS GroupDay,type
      FROM
        master..spt_values
      WHERE
        type = 'p' AND number <= DateDiff(day, @paySdate, @payEdate)
      ) a
      left join
        (select
          convert(char(32),create_time,23) as d, count(*) as e
        from
          trade_log where create_time >= @paySdate and create_time<=@payEdate
        group by convert(char(32),create_time,23)) b on b.d=a.GroupDay
-- 按小时统计交易笔数
select a.GroupDay, ISNULL(b.e,0) 'feeCount' from (
        SELECT
          substring(convert(char(32),DATEADD(HH,number,CONCAT(@paySdate,' ', @paySTime)),120),1,16) AS GroupDay,type
        FROM
          master..spt_values
        WHERE
          type = 'p' AND DATEDIFF(HH,DATEADD(HH,number,CONCAT(@paySdate,' ', @paySTime)),CONCAT(@payEdate,' ', @payETime))>=0
        ) a
       left join (
        select
         convert(char(32),create_time,23) as d, datepart(hh,create_time) as h,
         substring(convert(char(32),DATEADD(HH,datepart(hh,create_time),convert(char(32),create_time,23)),120),1,16) as st,
         count(*) as e
        from
         trade_log
       where create_time >= @paySdate and create_time<=@payEdate
         and convert(char(8),create_time,108)>=@paySTime and convert(char(8),create_time,108)<=@payETime
       group by convert(char(32),create_time,23),datepart(hh,create_time)) b
       on b.st=a.GroupDay order by GroupDay

五,总结及展望

掌握的知识点:

•熟悉了存储过程的语法和编写过程
•学习到了master..spt_values是什么?以及可以使用的场景?
•针对按时间进行统计,比如按天,小时进行统计的实现方法。

展望:

•局限性:这种方式目前只针对sqlserver, 但是目前大部分都是mysql。

总结

以上所述是小编给大家介绍的sqlserver/mysql按天、按小时、按分钟统计连续时间段数据,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • PHP+MySQL实现对一段时间内每天数据统计优化操作实例

    本文实例讲述了PHP+MySQL实现对一段时间内每天数据统计优化操作.分享给大家供大家参考,具体如下: 在互联网项目中,对项目的数据分析必不可少.通常会统计某一段时间内每天数据总计变化趋势调整营销策略.下面来看以下案例. 案例 在电商平台中通常会有订单表,记录所有订单信息.现在我们需要统计某个月份每天订单数及销售金额数据从而绘制出如下统计图,进行数据分析. 订单表数据结构如下: order_id order_sn total_price enterdate 25396 A4E610E250C2D

  • PHP+Mysql+jQuery中国地图区域数据统计实例讲解

    今天我要给大家介绍在实际应用中,如何把数据载入到地图中.本文结合实例,使用PHP+Mysql+jQuery实现中国地图各省份数据统计效果. 本例以统计某产品在各省份的活跃用户数为背景,数据来源于mysql数据库,根据各省份的活跃用户数,分成不同等级,并以不同的背景色显示各省份的活跃程度,符合实际应用需求. HTML 首先在head部分载入raphael.js库文件和chinamapPath.js路径信息文件. <script type="text/javascript" src=

  • 最新统计排名前十的SQL和NoSQL数据库排行榜

    本排名根据DB Engines的排行榜得来,该排行榜从人气上分析了市场上200个不同的数据库,这里一览Top 10. 无可争议的Top 3 Oracle.MySQL及Microsoft SQL Server一直以绝对的优势霸占着排行榜的前三名,以独特的优势瓜分了市场上最多的用户. 1.  Oracle 11g 首次发行:1980年 许可机制:Proprietary 是否SQL:是 Oracle是重要商业项目的首选,同时也是市场上最古老的主流数据库产品,Oracle有4个不同的版本可用:Enter

  • SQL语句技巧:按月统计数据

    表结构如下: qty date ---------------------------------------------- 13 2005/01/17 15 2005/01/19 3 2005/01/25 105 2005/01/27 1 2005/01/31 352 2005/02/03 12 2005/02/04 255 2005/02/07 6 2005/02/18 1 2005/02/19 28 2005/02/21 1 2005/02/22 394 2005/02/23 359 20

  • SQL 统计一个数据库中所有表记录的数量

    复制代码 代码如下: CREATE TABLE #tmptb(tbname sysname,tbrows int ,tbREserved varchar(10),tbData varchar(10) ,tbIndexSize varchar(10),tbUnUsed varchar(10)) INSERT INTO #tmptb exec sp_MSForEachTable 'EXEC sp_spaceused ''?''' SELECT * from #tmptb --列出所有表的情况 SEL

  • mysql按照天统计报表当天没有数据填0的实现代码

    1.问题复现: 按照天数统计每天的总数,如果其中有几天没有数据,那么group by 返回会忽略那几天,如何填充0?如下图,统计的10-3~10-10 7天的数据,其中只有8号和10号有数据,这样返回,数据只有2个,不符合报表统计的需求.期望没有值填0 2.换个思维: 我们用一组连续的天数作为左表然后left join 要查询的数据 最后group by.:连续天数表 t1 left join 业务数据  t2 group by t1.day ,如下图: SELECT t1.`day`, COU

  • SQLServer 2008 R2中使用Cross apply统计最新数据和最近数据

    使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数.表值函数作为右输入,外部表表达式作为左输入.通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出.APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表. 注意:若要使用 APPLY,数据库兼容级别必须至少为 90. APPLY 有两种形式:CROSS APPLY 和 OUTER APPLY.CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行.OUTER A

  • MySQL中几种数据统计查询的基本使用教程

    统计平均数 SELECT AVG() FROM 语法用于从数据表中统计数据平均数. 语法: SELECT AVG(column) FROM tb_name 该 SQL 语法用于统计某一数值类型字段的平均数,AVG() 内不能是多个字段,字符串等类型虽然可以执行,但无意义. 例子: SELECT AVG(uid) FROM user 得到查询结果: 2.5000 当然在此统计 uid 的平均数是无实际生产意义的,只是为了演示 AVG() 语法的用法. 统计数据之和 SELECT SUM() FRO

  • mysql 获取规定时间段内的统计数据

    mysql 获取规定时间段内的统计数据 按年统计 SELECT count(*), DATE_FORMAT(order_info.create_time, '%Y-%m-%d') AS count_by_date FROM order_info WHERE DATE_FORMAT(order_info.create_time, '%Y') = '2017' GROUP BY count_by_date ORDER BY NULL 按月统计 SELECT count(*), DATE_FORMAT

  • SQL按照日、周、月、年统计数据的方法分享

    --按日 select sum(consume),day([date]) from consume_record where year([date]) = '2006' group by day([date]) --按周quarter select sum(consume),datename(week,[date]) from consume_record where year([date]) = '2006' group by datename(week,[date]) --按月 select

随机推荐