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。
希望大神如果有mysql的实现方式,留下联系方式,小弟也虚心请教学习一下。
写得不好,望大家体谅。

sqlserver/mysql按天,按小时,按分钟统计连续时间段数据的更多相关文章
- mysql按照天或小时group分组统计
select DATE_FORMAT( deteline, "%Y-%m-%d %H" ) , COUNT( * ) FROM test GROUP BY DATE_FORMAT( ...
- C#-和时间有关的计算代码、时间相减 得到天数、小时、分钟、秒差
asp.net(C#)时间相减 得到天数.小时.分钟.秒差 asp.net(C#)时间相减 得到天数.小时.分钟.秒差 DateTime dtone = Convert.ToDateTime( ...
- SQL Server时间粒度系列----第5节小时、分钟时间粒度详解
本文目录列表: 1.SQL Server小时时间粒度2.SQL Server分钟时间粒度 3.总结语 4.参考清单列表 SQL Server小时时间粒度 这里说的时间粒度是指带有 ...
- asp.net(C#)时间相减 得到天数、小时、分钟、秒差
asp.net(C#)时间相减 得到天数.小时.分钟.秒差 DateTime dtone = Convert.ToDateTime("2007-1-1 05:00:00"); Da ...
- 从SQLSERVER/MYSQL数据库中随机取一条或者N条记录
从SQLSERVER/MYSQL数据库中随机取一条或者N条记录 很多人都知道使用rand()函数但是怎麽使用可能不是每个人都知道 建立测试表 USE [sss] GO ,NAME ) DEFAULT ...
- winform dateTimePicker选择时间控件-选择小时、分钟、秒
今天对公司项目进行改版(一个c/s客户端程序),要求dateTimePicker 能够选择小时,分钟.但找了很久,发现没有相关的简化控件,都是web的,没有winform的. 可是功夫不负有心人啊. ...
- js计算两个日期相隔几小时几分钟?
var dt1 = "2009-11-5 10:30" var dt2 = "2009-11-8 9:20" function ge ...
- php截取小时和分钟,在进行和其它时间段的比较
用php截取时间的小时和分钟,然后判断这个时间是不是在 8:00到11:30之间,用php应该怎么写? date_default_timezone_set("Asia/Shanghai&qu ...
- 使用joda-time工具类 计算时间相差多少 天,小时,分钟,秒
下面程序使用了两种方法计算两个时间相差 天,小时,分钟,秒 package jodotest; import java.text.ParseException; import java.text.Si ...
随机推荐
- react 父组件向子组件传递函数
这段时间一直在使用react,由于这react是单向数据绑定,总感觉有点不适用,毕竟之前一直都在使用angular,但学习还是要继续,做了一个迭代的项目,都差点忘记要总结一下这个react了,现在可以 ...
- QT环境安装VS2013(系统环境里设置QTDIR,并添加VS2013的BIN目录)
QT环境安装VS2013 文件名 1.qt5.5.1 qt-opensource-windows-x86-msvc2013-5.5.1.exe 2.qt vs插件 3.qt-vs-addin-1.2. ...
- 怎样一步一步删除(linux & UNIX)环境下 oracle 11g 集群节点
Deleting a Cluster Node on Linux and UNIX Systems 1.确定要删除的节点,是否active,pinned $ olsnodes -s -t 假设 ...
- java构造器的作用
通常通过在构造器中传入参数,对字段进行初始化,以达到初始化所创建的对象实例的目的.
- VC实现程序重启的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 很多时候系统有很多配置项,修改了配置项之后能有一个按钮实现系统重启.所谓重启就是杀死系统的当前进程,然后重新开一个新进 ...
- [转帖 ]MySQL 5.7 新特性 JSON
MySQL 5.7 新特性 JSON 的创建,插入,查询,更新 作者: 我不是鱼 (2016-08-31 16:13)分类: MySQL 标签: MySQL JSON MySQL JSON 应用 ...
- 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法
原文:更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序的函数: bool UpdateWinlogon ...
- String,CString,TCHAR,char之间区别和联系
char是类型TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底是char还是w_char; TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用 ...
- C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享
原文:C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享 1 : C# Assembly.GetEntryAssembly().GetName().Version. ...
- Visual Studio更改编码格式为“UTF-8”
原文:Visual Studio更改编码格式为"UTF-8" 用VS2015新建了个Python文件,在VS2015打开时中文显示正常, 用Visual Studio Code文本 ...