mysql--SQL编程(关于mysql中的日期,关于重叠) 学习笔记2.2
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相关推荐
- <SQL编程工具MySQL、SQLyog安装及环境配置教程>——《SQL》
目录 1.MySQL安装: 1.1 MySQL下载安装: 1.2 MySQL环境变量配置: 2.SQLyog安装: 2.1 SQLyog下载安装: 3.写在最后的话: 后记:●由于作者水平有限,文章难 ...
- mysql slow queries,检查 mysql sql 效能使用 MySQL Slow Queries
检查 mysql sql 效能使用 MySQL Slow Queries 点击: 发布日期:2013-05-06 本文来自 www.020fix.com 由于 MySQL 的普及,我们不难发现有许多 ...
- 面向对象的编程思想写单片机程序——(3)学习笔记 之 程序分层、数据产生流程
系列文章目录 面向对象的编程思想写单片机程序--(1)学习笔记 之 程序设计 面向对象的编程思想写单片机程序--(2)学习笔记 之 怎么抽象出结构体 面向对象的编程思想写单片机程序--(3)学习笔记 ...
- 中移物联网onenet入门学习笔记2:中移物联的通信格式
中移物联网onenet入门学习笔记2:中移物联的通信格式 中移物联网硬件接入协议:LWM2M协议,EDP协议,MQTT协议,HTTP协议,TCP透传,MODBUS协议,JT/T808协议,RCMP协议 ...
- mysql sql 时间比较_mysql中sql语句进行日期比较
这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql> SELECT something FROM table WHERE TO_DAY ...
- mysql sql先后执行_MySQL中SQL语句执行顺序
(7) SELECT (8) DISTINCT (1) FROM (3) JOIN (2) ON (4) WHERE (5) GROUP BY (6) HAVING (9) ORDER BY (10) ...
- oracle中如何格式化输出,【学习笔记】数据库日期时间格式化输出案例
天萃荷净 分享一篇关于开发DBA在工作中常用到的日期时间格式化输出方法案例,含:mysql.sql server.oracle 3种数据库日期时间格式化输出 1.mysql数据库时间格式化输出 DAT ...
- Linux中常用的文件目录,Linux学习笔记2——Linux中常用文件目录操作命令
ls 显示文件和目录列表 -l 列出文件的详细信息 -a 列出当前目录所有文件,包含隐藏文件 mkdir 创建目录 -p 父目录不存在情况下先生成父目录 cd 切换目录 touch 生成一个空文件 e ...
- 【编程不良人】MongoDB最新实战教程学习笔记
简介 视频链接:01.简介和历史_哔哩哔哩_bilibili 文档地址: https://docs.mongodb.com/manual/ MongoDB教程:MongoDB 教程 | 菜鸟教程 注意 ...
最新文章
- 【OpenCV】cv::Mat和std::vector之间的相互转换
- android c/c++ eclipse 绿色版 环境的配置
- 在线音乐电台Pandora股价暴涨20% CEO肯尼迪辞任
- 全景分割这一年,端到端之路
- 参加完阿里蚂蚁金服Java中间件6轮面试题!6点血泪总结~
- Expected one result (or null) to be returned by selectOne(), but found: 7
- git使用.gitignore 忽略文件和忽略已经提交过的文件
- ubuntu proxy
- RestLet框架的入门
- 黑马java架构师课_【黑马精品】Java架构师实战训练营
- charles请求转发_使用Charles代理进行请求转发
- Java同步问题_Java多线程同步问题
- 网游之古剑太初最新章节
- 《神经网络与深度学习》(Michael Nielsen)Neural Networks and Deep Learning习题解答汇总
- 硬件工程师常用的电路基础公式+换算!
- ISO26262解析(四)——FMEDA
- Linux文件操作命令及磁盘分区与文件系统
- 求幂级数展开的部分和 / 求分数序列前N项和 / 特殊a串数列求和
- org.springframework.amqp.AmqpException: No method found for class [B
- [笔记][总结] MIT线性代数 Gilbert Strang 矩阵的应用