1.日期中的重叠问题
建表sessions:

CREATE TABLE `sessions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`app` varchar(10) NOT NULL,
`usr` varchar(10) NOT NULL,
`starttime` time NOT NULL,
`endtime` time NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB

插入记录:

insert into sessions(app,usr,starttime,endtime) values('app1','user1','08:30','08:45');
insert into sessions(app,usr,starttime,endtime) values('app1','user2','09:00','09:30');
insert into sessions(app,usr,starttime,endtime) values('app1','user1','09:15','10:30');
insert into sessions(app,usr,starttime,endtime) values('app1','user2','09:15','09:30');
insert into sessions(app,usr,starttime,endtime) values('app1','user1','10:30','14:30');
insert into sessions(app,usr,starttime,endtime) values('app1','user2','10:45','11:30');
insert into sessions(app,usr,starttime,endtime) values('app1','user1','11:00','12:30');
insert into sessions(app,usr,starttime,endtime) values('app2','user1','08:30','08:45');
insert into sessions(app,usr,starttime,endtime) values('app2','user1','08:30','08:45');
insert into sessions(app,usr,starttime,endtime) values('app2','user2','09:00','09:30');
insert into sessions(app,usr,starttime,endtime) values('app2','user1','11:45','12:00');
insert into sessions(app,usr,starttime,endtime) values('app2','user2','12:30','14:00');
insert into sessions(app,usr,starttime,endtime) values('app2','user1','12:45','13:30');
insert into sessions(app,usr,starttime,endtime) values('app2','user2','13:00','14:00');
insert into sessions(app,usr,starttime,endtime) values('app2','user1','14:00','16:30');
insert into sessions(app,usr,starttime,endtime) values('app2','user2','15:30','17:00');

创建索引,加快查询速度:

mysql> create unique index idx_app_usr_s_e_key on sessions(app,usr,starttime,endtime,id);
Query OK, 0 rows affected (0.23 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> create index idx_app_s_e on sessions(app,starttime,endtime);
Query OK, 0 rows affected (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show index in sessions;
+----------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| sessions | 0 | PRIMARY | 1 | id | A | 2 | NULL | NULL | | BTREE | | |
| sessions | 0 | idx_app_usr_s_e_key | 1 | app | A | 16 | NULL | NULL | | BTREE | | |
| sessions | 0 | idx_app_usr_s_e_key | 2 | usr | A | 16 | NULL | NULL | | BTREE | | |
| sessions | 0 | idx_app_usr_s_e_key | 3 | starttime | A | 16 | NULL | NULL | | BTREE | | |
| sessions | 0 | idx_app_usr_s_e_key | 4 | endtime | A | 16 | NULL | NULL | | BTREE | | |
| sessions | 0 | idx_app_usr_s_e_key | 5 | id | A | 16 | NULL | NULL | | BTREE | | |
| sessions | 1 | idx_app_s_e | 1 | app | A | 16 | NULL | NULL | | BTREE | | |
| sessions | 1 | idx_app_s_e | 2 | starttime | A | 16 | NULL | NULL | | BTREE | | |
| sessions | 1 | idx_app_s_e | 3 | endtime | A | 16 | NULL | NULL | | BTREE | | |
+----------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
9 rows in set (0.00 sec)

重叠的分类:标示重叠,分组重叠,最大重叠

标示重叠:为每个会话标示出相同应用程序用户重叠及最大重叠会话数

mysql> select a.app,a.usr,a.starttime,a.endtime,b.starttime,b.endtime from sessions a,sessions b where a.app=b.app and a.usr=b.usr and (b.endtime>=a.starttime and b.starttime<=a.endtime);

 

+------+-------+-----------+----------+-----------+----------+
| app | usr | starttime | endtime | starttime | endtime |
+------+-------+-----------+----------+-----------+----------+
| app1 | user1 | 08:30:00 | 08:45:00 | 08:30:00 | 08:45:00 |
| app1 | user1 | 09:15:00 | 10:30:00 | 09:15:00 | 10:30:00 |
| app1 | user1 | 09:15:00 | 10:30:00 | 10:30:00 | 14:30:00 |
| app1 | user1 | 10:30:00 | 14:30:00 | 09:15:00 | 10:30:00 |
| app1 | user1 | 10:30:00 | 14:30:00 | 10:30:00 | 14:30:00 |
| app1 | user1 | 10:30:00 | 14:30:00 | 11:00:00 | 12:30:00 |
| app1 | user1 | 11:00:00 | 12:30:00 | 10:30:00 | 14:30:00 |
| app1 | user1 | 11:00:00 | 12:30:00 | 11:00:00 | 12:30:00 |
| app1 | user2 | 09:00:00 | 09:30:00 | 09:00:00 | 09:30:00 |
| app1 | user2 | 09:00:00 | 09:30:00 | 09:15:00 | 09:30:00 |
| app1 | user2 | 09:15:00 | 09:30:00 | 09:00:00 | 09:30:00 |
| app1 | user2 | 09:15:00 | 09:30:00 | 09:15:00 | 09:30:00 |
| app1 | user2 | 10:45:00 | 11:30:00 | 10:45:00 | 11:30:00 |
| app2 | user1 | 08:30:00 | 08:45:00 | 08:30:00 | 08:45:00 |
| app2 | user1 | 08:30:00 | 08:45:00 | 08:30:00 | 08:45:00 |
| app2 | user1 | 08:30:00 | 08:45:00 | 08:30:00 | 08:45:00 |
| app2 | user1 | 08:30:00 | 08:45:00 | 08:30:00 | 08:45:00 |
| app2 | user1 | 11:45:00 | 12:00:00 | 11:45:00 | 12:00:00 |
| app2 | user1 | 12:45:00 | 13:30:00 | 12:45:00 | 13:30:00 |
| app2 | user1 | 14:00:00 | 16:30:00 | 14:00:00 | 16:30:00 |
| app2 | user2 | 09:00:00 | 09:30:00 | 09:00:00 | 09:30:00 |
| app2 | user2 | 12:30:00 | 14:00:00 | 12:30:00 | 14:00:00 |
| app2 | user2 | 12:30:00 | 14:00:00 | 13:00:00 | 14:00:00 |
| app2 | user2 | 13:00:00 | 14:00:00 | 12:30:00 | 14:00:00 |
| app2 | user2 | 13:00:00 | 14:00:00 | 13:00:00 | 14:00:00 |
| app2 | user2 | 15:30:00 | 17:00:00 | 15:30:00 | 17:00:00 |
+------+-------+-----------+----------+-----------+----------+
26 rows in set (0.00 sec)

 

分组重叠:服务商可能允许多个session的连接,并把其计费统计为1次,这就是所谓的分组重叠,对于例子中应该把app1,user1在08:30--10:30合并算为一次会话.
如下:

mysql> select distinct app,usr,starttime as s from sessions as a where not exists(select * from sessions as b where a.app=b.app and a.usr=b.usr and a.starttime>b.starttime and a.starttime<=b.endtime);
+------+-------+----------+
| app | usr | s |
+------+-------+----------+
| app1 | user1 | 08:30:00 |
| app1 | user1 | 09:15:00 |
| app1 | user2 | 09:00:00 |
| app1 | user2 | 10:45:00 |
| app2 | user1 | 08:30:00 |
| app2 | user1 | 11:45:00 |
| app2 | user1 | 12:45:00 |
| app2 | user1 | 14:00:00 |
| app2 | user2 | 09:00:00 |
| app2 | user2 | 12:30:00 |
| app2 | user2 | 15:30:00 |
+------+-------+----------+
11 rows in set (0.01 sec)
mysql> select distinct app,usr,starttime as e from sessions as a where not exists(select * from sessions as b where a.app=b.app and a.usr=b.usr and a.endtime>=b.starttime and a.endtime<b.endtime);
+------+-------+----------+
| app | usr | e |
+------+-------+----------+
| app1 | user1 | 08:30:00 |
| app1 | user1 | 10:30:00 |
| app1 | user2 | 09:00:00 |
| app1 | user2 | 09:15:00 |
| app1 | user2 | 10:45:00 |
| app2 | user1 | 08:30:00 |
| app2 | user1 | 11:45:00 |
| app2 | user1 | 12:45:00 |
| app2 | user1 | 14:00:00 |
| app2 | user2 | 09:00:00 |
| app2 | user2 | 12:30:00 |
| app2 | user2 | 13:00:00 |
| app2 | user2 | 15:30:00 |
+------+-------+----------+
13 rows in set (0.00 sec)

创建视图:v_s和v_e

mysql> create view v_s as select distinct app,usr,starttime as s from sessions as a where not exists(select * from sessions as b where a.app=b.app and a.usr=b.usr and a.starttime>b.starttime and a.starttime<=b.endtime);
mysql> create view v_e as select distinct app,usr,starttime as e from sessions as a where not exists(select * from sessions as b where a.app=b.app and a.usr=b.usr and a.endtime>=b.starttime and a.endtime<b.endtime);

未完待续......

mysql--SQL编程(关于mysql中的日期,关于重叠) 学习笔记2.2的更多相关文章

  1. C#同步,异步的理解,包括5.0中await和async(学习笔记)

    之前在工作中一直用的是同步线程,就是先进入画面的load事件,然后在里面进行数据库调用的处理.后面又遇到了公司软件中一些比较古老的代码,一开始在那块古老代码中增加机能的时候,我想用到数据库的数据给画面 ...

  2. Oracle使用触发器和mysql中使用触发器的比较——学习笔记

    一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...

  3. 网络编程1--毕向东java基础教程视频学习笔记

    目录: 01 网络编程概述1 02 网络编程概述2 03网络编程 网络模型 04网络编程 IP地址 05网络编程 TCP和UDP 06网络编程 Socket 07网络编程 UDP发送端 01 网络编程 ...

  4. 《C#高级编程(第六版)》泛型学习笔记(一):泛型优点和特性 (转载)

    原文出处:http://www.cnblogs.com/xun126/archive/2011/01/13/1933838.html 泛型是CLR 2.0的一个新特性,在CLR 1.0中,要创建一个灵 ...

  5. Python 中的map和reduce学习笔记

    map和reduce都是Python中的内置函数 map函数接受两个参数,第一个参数是函数,第二个参数是列表,将函数依次作用于列表中的元素,并返回一个元素 reduce同样以函数和列表作为参数,区别在 ...

  6. 网络编程4--毕向东java基础教程视频学习笔记

    Day24 06 自定义浏览器-Tomcat服务端07 自定义图形界面浏览器-Tomcat服务端08 URL-URLConnection09 小知识点10 域名解析 06 自定义浏览器-Tomcat服 ...

  7. 网络编程3--毕向东java基础教程视频学习笔记

    Day24 01 TCP上传图片02 客户端并发上传图片03 客户端并发登录04 浏览器客户端-自定义服务端05 浏览器客户端-Tomcat服务端 01 TCP上传图片 import java.net ...

  8. 网络编程2--毕向东java基础教程视频学习笔记

    Day 23 08 Udp接收端09 Udp键盘录入数据方式10 Udp聊天11 TCP传输12 TCP传输213 TCP练习14 TCP复制文件 08 Udp接收端 需求:定义一个应用程序,用于接收 ...

  9. contiki-main.c 中的process系列函数学习笔记 <contiki学习笔记之六>

    说明:本文依然依赖于 contiki/platform/native/contiki-main.c 文件. ---------------------------------------------- ...

随机推荐

  1. Linux服务器安装zabbix监控平台

    zabbix是基于web界面的开源分布式监控平台,可以监控各种服务器的配置参数,支持自定义配置和自定义告警,并且可以实现邮件.短信等方式的告警,zabbix基本组件如下: zabbix_server: ...

  2. 对Kalman(卡尔曼)滤波器的理解@@zz

    1.简介(Brief Introduction) 在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”.跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是一个人的名字,而跟他们不同的是,他 ...

  3. Android -- Exif

    Exif Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了数码照片的信息,包括拍摄的光圈.快门.平衡白.ISO.焦距.日期时间等各种和拍摄 ...

  4. Android -- isInEditMode

    解释 Indicates whether this View is currently in edit mode. A View is usually in edit mode when displa ...

  5. 如何基于TensorFlow使用LSTM和CNN实现时序分类任务

    https://www.jiqizhixin.com/articles/2017-09-12-5 By 蒋思源2017年9月12日 09:54 时序数据经常出现在很多领域中,如金融.信号处理.语音识别 ...

  6. sql server2008R2 无法连接到WMI提供程序。你没有权限或者该服务器无法访问

    在自己的Win8.1的系统在安装了Vs2013和Sqlserver2008R2 今天在打开ssms的时候发现连接不上数据库,且出现了以下问题 然后打开Sqlserver配置管理器准备看看sqlserv ...

  7. 转:查看linux系统版本号

    转自: http://blog.csdn.net/zhuying_linux/article/details/6859286 lsb_release -a

  8. Ubuntu mysql开启远程登录的方法

    一.问题 Ubuntu  16.0.4   mysql5.7 二.解决问题 Ubuntu中MySQL的配置文件是在/etc/mysql/mysql.conf.d/mysqld.cnf,VI该文件把 b ...

  9. 构建高性能服务(二)java高并发锁的3种实现

    构建高性能服务(二)java高并发锁的3种实现 来源:http://www.xymyeah.com/?p=46   提高系统并发吞吐能力是构建高性能服务的重点和难点.通常review代码时看到sync ...

  10. C#.NET常见问题(FAQ)-如何设置控件水平对齐,垂直对齐

    如果要设置一些控件垂直对齐,点击这个按钮   如果要设置水平对齐,则点击这个按钮,选中控件之后点击左对齐(多个按钮都试下吧,总归能对齐到你要的效果的)   更多教学视频和资料下载,欢迎关注以下信息: ...