三、现在我们假设应用计时分为app应用和web应用,需要考虑如下几个方面:

(1)多时间段(2)表中有冗杂数据

(3)用户是在web端和app端都登陆,这种类型的重复时间段只能取其一

存在数据:

存在表:应用启动时间统计表Applic_Sessions:

字段:applic    platform     start_time     end_time     status     rowid

X          web           11:30              18:33           1           1

X          app            11:10              17:50           1           2

X          app            17:55              19:55           1           3

X          app            20:31              22:31           1           4

X          web            02:01              02:40           1           5

利用sql语句的方式获取到开始时间和结束时间,timestampdiff( )相减得到。

(1)取出X用户两平台中启动的最小时间

(2)取出X用户两平台中结束的最大时间

按照以上步骤,这样会带来一个问题:如rowid 为1和5的记录,相减所得结果明显大于实际结果。

尝试方案1:将不同平台的数据区分开单独计数:

(1)select t.* from Applic_Sessions t where t.platform = “web”;

视图:Web_View

applic     platform      start_time     end_time      status     rowid

X         web               11:30              18:33           1           1

X          web               02:01              02:40           1           2

select sum(timestampdiff(second,start_time,end_time)) from Web_View;

(2)select t.* from Applic_Sessions t where t.platform = “app”;

视图:App_View

applic      platform     start_time     end_time     status     rowid

X             app           11:10              17:50            1           1

X             app           17:55              19:55            1           2

X             app           20:31              22:31            1           3

select sum(timestampdiff(second,start_time,end_time)) from Web_View;

这样求取出单个平台的使用时长,这种适用于:app使用时长可以换取双倍积分 等需求。但是至于中间的重复时间段更加干不掉了,这种方法pass。

方案2:

视图:Applic_Sessions

applic platform  start_time end_time status rowid

Xweb      11:30 18:33  1  1

Xapp      11:10 17:50  1  2

Xapp      17:55 19:55  1  3

X app       20:31  22:31   1   4

X web       02:01  02:40   1   5

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

11:30............................................18:33(web)

11:10....................17:50(app)

17:55.................19:55(app)

02:01....02:40                                                                                                      20:31.......22:31

整理一下数据,发现其中的难点就是:web的使用时长段与app的使用时间段夹杂在一起,其他正常数据横向合并就成,那第一步就是把这些夹杂数据单独拎出来,然后取出最小启动值和最大结束值,相减就好拉:

写下这个sql,越看越别扭,能行么---显然不行

select t.* from Applic_Sessions t where

t.start_time between (select min(t.start_time) from Applic_Sessions t)

and (select max(t.end_time) from Applic_Sessions t)

and t.end_time between t.start_time and t.end_time;

至此,卡住了。。。

绞尽了脑汁,搞不定啊,有哪位大神可以帮帮忙啊,谢谢了

求助:关于sql如何统计时间的问题的更多相关文章

  1. 全废话SQL Server统计信息(2)——统计信息基础

    接上文:http://blog.csdn.net/dba_huangzj/article/details/52835958 我想在大地上画满窗子,让所有习惯黑暗的眼睛都习惯光明--顾城<我是一个 ...

  2. SQL Server统计信息:问题和解决方式

    在网上看到一篇介绍使用统计信息出现的问题已经解决方式,感觉写的很全面. 在自己看的过程中顺便做了翻译. 因为本人英文水平有限,可能中间有一些错误. 假设有哪里有问题欢迎大家批评指正.建议英文好的直接看 ...

  3. 梁敬彬老师的《收获,不止SQL优化》,关于如何缩短SQL调优时间,给出了三个步骤,

    梁敬彬老师的<收获,不止SQL优化>,关于如何缩短SQL调优时间,给出了三个步骤, 1. 先获取有助调优的数据库整体信息 2. 快速获取SQL运行台前信息 3. 快速获取SQL关联幕后信息 ...

  4. SQL 时间范围和时间粒度

    前言 使用 SQL 进行业务数据计算时,经常会遇到两个概念:时间范围 和 时间粒度 .以 最近一天的每小时的用户访问人数 为例: 最近一天 是时间范围 每小时 是时间粒度 常见的时间范围:最近五分钟. ...

  5. sql server日期时间转字符串

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

  6. SQL Server日期时间格式转换字符串详解 (详询请加qq:2085920154)

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

  7. SQL Server日期时间格式转换字符串

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

  8. SQL语句统计每天、每月、每年的 数据

    SQL语句统计每天.每月.每年的数据 1.每年select year(ordertime) 年,sum(Total) 销售合计from 订单表group by year(ordertime) 2.每月 ...

  9. sql server日期时间转字符串(转)

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

随机推荐

  1. BZOJ 1927: [Sdoi2010]星际竞速 [上下界费用流]

    1927: [Sdoi2010]星际竞速 题意:一个带权DAG,每个点恰好经过一次,每个点有曲速移动到他的代价,求最小花费 不动脑子直接上上下界费用流过了... s到点连边边权为曲速的代价,一个曲速移 ...

  2. ctags的使用

    1. 生成tags文件 为当前目录下的所有C程序文件生成对应的tags文件: $ ctags *.c        为同一个目录下的所有文件建立tags如下 $ ctags –R (较常用) 这个命令 ...

  3. 新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD Application Key

    新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD应用的Key 前篇讲过有一个面向公众的Runbook库,社区和微软一直往其中加入新的Runbook, ...

  4. LeetCode - 626. Exchange Seats

    Mary is a teacher in a middle school and she has a table seat storing students' names and their corr ...

  5. memcached 的实践操作

    memcached安装和使用   yum install -y libevent  memcached  libmemcached   启动命令:   /etc/init.d/memcached st ...

  6. 原创!!jquery简单tips和dialog

    <!------------------html代码-----------------------> <!DOCTYPE html><html><head&g ...

  7. Java经典编程题50道之十六

    输出九九乘法表. public class Example16 {    public static void main(String[] args) {        table(9);    } ...

  8. crack the coding interview

    crack the coding interview answer c++ 1.1 #ifndef __Question_1_1_h__  #define __Question_1_1_h__  #i ...

  9. 自定义JpaUtil,快速完成Hql执行逻辑(一)

    这段时间学习Spring Data JPA功能模块.Java持久性API(简称JAP)是类和方法的集合,以海量数据关系映射持久并存储到数据库,这是由Oracle公司提供方案技术.在JAVA社区,深受爱 ...

  10. django新手第一课

    django是基于python的一个web框架,大致结构如下: 在pycharm,python2.7,django1.8,mysql都装好的情况下,现在开始django的初试: 一.基础启动djang ...