sql中时间以5分钟半个小时任意间隔分组的实现方法

开发中遇到过问题就是对时间以半个小时分钟分组,如统计08:00-08:30的人数,08:30-09:00的人数,貌似sql中没有这样的函数吧,直接从数据库里查出来,在java里分组也太low了吧

想到方法1 自定义函数,自己实现时间的半个小时转换,统计时调用函数

CREATE FUNCTION `date_half_hour_format`(in_date TIMESTAMP) RETURNS TIMESTAMP
BEGIN
 DECLARE out_date TIMESTAMP;
 DECLARE s_date VARCHAR(255);
 DECLARE s_minute VARCHAR(2);
 DECLARE int_minute INT;

 SET s_minute = SUBSTRING(in_date, 15, 2);
 SET int_minute = CAST(s_minute AS SIGNED);

 IF int_minute <= 29 THEN
  SET int_minute = 0;
  SET s_date = CONCAT(LEFT(in_date, 14),'0',int_minute);
 ELSE
  SET int_minute = 30;
  SET s_date = CONCAT(LEFT(in_date, 14),int_minute);
 END IF;

 SET out_date = STR_TO_DATE(s_date,'%Y-%m-%d %H:%i');

 RETURN out_date;
  END

方法2 学过c语言更清楚c语言创建时间都是一个long的时间戳,可以对时间做除法运算,就是时间long的值除以30*60,这样就能得出半个小时的时间了,mysql中有函数unix_timestamp获取long的时间,从long转date的form_unixtime

SELECT FROM_UNIXTIME((UNIX_TIMESTAMP(CURRENT_TIMESTAMP) DIV 1800)*1800)

这样就可以按任意时间分组了

ps:SQL Server 时间查询

select dateadd(dd,-day(getdate()) + 1,getdate()) '当月起始时间'  //查询当月起始时间

select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) '当月结束时间'  //查询当月结束时间

select dateadd(dd,-day(dateadd(month,-1,getdate()))+1,dateadd(month,-1,getdate())) '上月起始时间'  //查询上月起始时间

select dateadd(dd,-day(getdate()),getdate()) '上月结束时间'  //查询上月结束时间

select dateadd(quarter,datediff(quarter,0,getdate())-1,0) as '当前季度的上个季度初'  //查询当前季度的上个季度开始时间

select dateadd(quarter,datediff(quarter,0,getdate()),-1) as '当前季度的上个季度末'  //查询当前季度的上个季度结束时间

select dateadd(quarter,datediff(quarter,0,getdate()),0) as '当前季度的第一天'  //查询当前季度起始时间

select dateadd(quarter,1+datediff(quarter,0,getdate()),-1) as '当前季度的最后一天'  //查询当前季度结束时间

select dateadd(quarter,1+datediff(quarter,0,getdate()),0) as '当前季度的下个季度初'  //查询当前季度下个季度开始时间

select dateadd(quarter,2+datediff(quarter,0,getdate()),-1) as '当前季度的下个季度末'  //查询当前季度下个季度结束时间

select dateadd(year,datediff(year,0,DATEADD(year,-1,getdate())),0) '去年的第一天'  //去年的第一天

select dateadd(year,datediff(year,0,getdate()),-1) '去年最后一天'  //去年的最后一天

select dateadd(year, datediff(year, 0, getdate()), 0) '当年的第一天'  //当年的第一天

select dateadd(year,datediff(year,0,dateadd(year,1,getdate())),-1) '当年的最后一天'  //当年的最后一天

总结

以上所述是小编给大家介绍的sql中时间以5分钟半个小时任意间隔分组的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • SQL SERVER 分组求和sql语句

    需求:如下图所示 实现sql语句 SELECT A1,SUM(A2*A3) FROM A GROUP BY A1 大家可以自行测试一下,主要需要了解group by语句的用法

  • sql server如何利用开窗函数over()进行分组统计

    这是一道常见的面试题,在实际项目中经常会用到. 需求:求出以产品类别为分组,各个分组里价格最高的产品信息. 实现过程如下: declare @t table( ProductID int, ProductName varchar(20), ProductType varchar(20), Price int) --测试数据 insert @t select 1,'name1','P1',3 union all select 2,'name2','P1',5 union all select 3,

  • mysql使用GROUP BY分组实现取前N条记录的方法

    本文实例讲述了mysql使用GROUP BY分组实现取前N条记录的方法.分享给大家供大家参考,具体如下: MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~): 结果: 方法一: 复制代码 代码如下: SELECT a.id,a.SName,a.ClsNo,a.Score FROM aa a LEFT J

  • 详解MySQL中的分组查询与连接查询语句

    分组查询 group by group by 属性名 [having 条件表达式][ with rollup] "属性名 "指按照该字段值进行分组:"having 条件表达式 "用来限制分组后的显示,满足条件的结果将被显示:with rollup 将会在所有记录的最后加上一条记录,该记录是上面所有记录的总和. 1)单独使用 group by 单独使用,查询结果只显示一个分组的一条记录. 实例: select * from employee group by sex;

  • MYSQL每隔10分钟进行分组统计的实现方法

    前言 本文的内容主要是介绍了MYSQL每隔10分钟进行分组统计的实现方法,在画用户登录.操作情况在一天内的分布图时会非常有用,之前我只知道用「存储过程」实现的方法(虽然执行速度快,但真的是太不灵活了),后来学会了用高级点的「group by」方法来灵活实现类似功能. 正文: -- time_str '2016-11-20 04:31:11' -- date_str 20161120 select concat(left(date_format(time_str, '%y-%m-%d %h:%i'

  • mysql 将字段time按天/月/年分组

    假设表中有一个字段time,格式为Unix时间戳,现需要按照该字段统计每天的记录数. 方法: 利用convert函数convert(char(10),time,120) as time,然后group by time即可. 原理:convert函数将时间戳转换成ODBC标准时间(120参数指定),然后取前十位,则刚好得到完整日期(不含时分秒),再分组即可. 按月,按年分组方法一样,只需要修改convert()方法第一个参数的长度.

  • 分组后分组合计以及总计SQL语句(稍微整理了一下)

    今天看到了这个文章感觉内容挺多的,就是比较乱,实在不好整理,我们小编就简单整理了一下,希望大家能凑合看吧 分组后分组合计以及总计SQL语句   1)想一次性得到分组合计以及总计,sql: SELECT 分组字段 FROM 表 GROUP BY 分组字段 compute sum(COUNT(*)) 2)分组合计1: SELECT COUNT(*) FROM (SELECT 分组字段 FROM 表 GROUP BY 分组字段 )别名 3)分组合计2: SELECT COUNT(*) FROM (SE

  • sql中时间以5分钟半个小时任意间隔分组的实现方法

    开发中遇到过问题就是对时间以半个小时分钟分组,如统计08:00-08:30的人数,08:30-09:00的人数,貌似sql中没有这样的函数吧,直接从数据库里查出来,在java里分组也太low了吧 想到方法1 自定义函数,自己实现时间的半个小时转换,统计时调用函数 CREATE FUNCTION `date_half_hour_format`(in_date TIMESTAMP) RETURNS TIMESTAMP BEGIN DECLARE out_date TIMESTAMP; DECLARE

  • SQL中WHERE变量IS NULL条件导致全表扫描问题的解决方法

    复制代码 代码如下: SET @SQL = 'SELECT * FROM Comment with(nolock) WHERE 1=1    And (@ProjectIds Is Null or ProjectId = @ProjectIds)    And (@Scores is null or Score =@Scores)' 印象中记得,以前在做Oracle开发时,这种写法是会导致全表扫描的,用不上索引,不知道Sql Server里是否也是一样呢,于是做一个简单的测试1.建立测试用的表结

  • 大数据Spark Sql中日期转换FROM_UNIXTIME和UNIX_TIMESTAMP的使用

    目录 UNIX_TIMESTAMP FROM_UNIXTIME 众所周知,数字整型用来大小比较和计算运算要比字符型快的多,因此部分业务需要把时间字段转化为整型方便业务的快速计算和到达,这个整形数字是选定的日期距UTC 时间 '1970-01-01 00:00:00' 开始的秒数,目前为十位,比如常用来举例的1234567890,但毕竟数字不方便观察,后续还需要把这些时间数字转换为真正的时间字段 这里就需要两个函数来进行转换UNIX_TIMESTAMP和FROM_UNIXTIME 咱们一一介绍 U

  • SQL中concat和substr组合运用解析

    目录 concat和substr组合运用 背景 脚本有放在最后一章进行分析 concat介绍 substr介绍 最后SQL语句分析 concat和substr组合运用 背景 最近客户要我给一个脚本说查数据,说是要 截取sql表中某一个字段的前5个数值 进行查找. 刚开始我以为很简单就接了下来开始想,想了之后发现并没有这么简单(自己太菜了),就去问朋友(大数据开发). 给了我 这两个函数(concat和substr)让我自己去玩 ,但是客户一直再催没办法只能找我们自己的开发写脚本. Ten min

  • SQL中DATEADD和DATEDIFF的用法示例介绍

    通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割(年.月.日等),然后仅仅用分割出来的年.月.日等放在几个函数中计算出自己所需要的日期! 在这篇文章里,我将告诉你如何使用DATEADD和DATEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期. 在使用本文中的例子之前,你必须注意以下的问题.大部分可能不是所有例子在不同的机器上执行的结果可能不一样,这完全由哪一天是一个星期的第一天这个设置决定.第

  • SQL2008 详解直接将XML存入到SQL中

    一.前言 从 SQL Server 2005 开始,就增加了 xml 字段类型,也就是说可以直接把 xml 内容存储在该字段中,并且 SQL Server 会把它当作 xml 来对待,而不是当作 varchar 来对待. 随着SQL Server 对XML字段的支持,相应的,T-SQL语句也提供了大量对XML操作的功能来配合SQL Server中XML字段的使用.本文主要说明如何使用SQL语句对XML进行操作. 二.定义XML字段 在进行数据库的设计中,我们可以在表设计器中,很方便的将一个字段定

  • SQL中一些小巧但常用的关键字小结

    前言 前面的几篇文章中,我们大体上介绍了 SQL 中基本的创建.查询语句,甚至也学习了相对复杂的连接查询和子查询,这些基本功相信你也一定掌握的不错,那么本篇则着重介绍几个技巧方面的关键字,能够让你更快更有效率的写出一些 SQL. 下面话不多说了,来一起看看详细的介绍吧 起别名 在实际的项目中,有时候我们的表名.字段名过于复杂以致于我们的 SQL 写出来过长.过于复杂,这时候我们往往会通过起别名的方式将一些名字较长.较为复杂的字段或是表名简化. 我们可以使用别名(Alias)来对数据表或者列进行临

  • 对pandas中时间窗函数rolling的使用详解

    在建模过程中,我们常常需要需要对有时间关系的数据进行整理.比如我们想要得到某一时刻过去30分钟的销量(产量,速度,消耗量等),传统方法复杂消耗资源较多,pandas提供的rolling使用简单,速度较快. 函数原型和参数说明 DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None) window:表示时间窗的大小,注意有两种形式

  • R语言中时间序列分析浅析

    时间序列是将统一统计值按照时间发生的先后顺序来进行排列,时间序列分析的主要目的是根据已有数据对未来进行预测. 一个稳定的时间序列中常常包含两个部分,那么就是:有规律的时间序列+噪声.所以,在以下的方法中,主要的目的就是去过滤噪声值,让我们的时间序列更加的有分析意义. 语法 时间序列分析中ts()函数的基本语法是 timeseries.object.name <- ts(data, start, end, frequency) 以下是所使用的参数的描述 data是包含在时间序列中使用的值的向量或矩

  • 详解Java关于JDK中时间日期的API

    目录 JDK 8中关于日期和时间的API测试 JDK 8 之前日期和时间的API测试 //1.System类中的currentTimeMillis() public void test1(){ long time = System.currentTimeMillis(); //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为时间为单位的时间差. //称为时间戳 System.out.println(time);//1628416744054 } /* java.util.Date类 |-

随机推荐