Oracle计算连续天数,计算连续时间,Oracle连续天数统计

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>..

蕃薯耀 2016年11月25日 14:28:00 星期五

http://fanshuyao.iteye.com/

mysql计算连续天数,mysql连续登录天数,连续天数统计:

http://fanshuyao.iteye.com/blog/2341455

Oracle计算连续天数,计算连续时间,Oracle连续天数统计

http://fanshuyao.iteye.com/blog/2341163

今天突然有个想法,就是计算出一个连续时间(天数),表如下:

create table user_login(

pid NUMBER not null ,--表示每个用户

login_time TIMESTAMP not null--登录时间

);

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-25 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-24 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-24 16:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-23 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-23 16:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-21 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-20 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-19 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-18 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-17 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-16 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-15 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-14 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-13 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(1,TO_DATE('2016-11-10 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-25 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-24 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-24 16:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-23 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-22 16:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-21 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-20 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-19 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-18 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-16 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-15 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-14 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(2,TO_DATE('2016-11-13 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(3,TO_DATE('2016-11-24 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(3,TO_DATE('2016-11-23 16:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(3,TO_DATE('2016-11-21 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(4,TO_DATE('2016-11-23 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(4,TO_DATE('2016-11-21 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(4,TO_DATE('2016-11-20 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(5,TO_DATE('2016-11-02 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(5,TO_DATE('2016-11-01 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(5,TO_DATE('2016-10-31 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(5,TO_DATE('2016-10-30 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

insert into user_login(pid, login_time) values(5,TO_DATE('2016-10-28 13:30:45', 'yyyy-MM-dd HH24:MI:SS'));

根据登录时间,算出某个用户的登录连续天数。

方法一:

采用递归的方法,如下:

--根据pid只查询某个人的连续天数

--不计算当天的,计算昨天及以前的,所以Sysdate-1

--想法是把昨天及以前的连续数据查询出来,然后统计记录数

select count(*) from (

select * from (

select distinct pid,TO_DATE(TO_CHAR(LOGIN_TIME, 'YYYY-MM-DD'),'YYYY-MM-DD') LOGIN_TIME from user_login where pid=2

) a

start with TO_CHAR((Sysdate-1), 'YYYY-MM-DD') = TO_CHAR(a.LOGIN_TIME, 'YYYY-MM-DD')

connect by prior TO_CHAR((a.LOGIN_TIME-1), 'YYYY-MM-DD') = TO_CHAR(a.LOGIN_TIME, 'YYYY-MM-DD')

)

;

方法二:只适用每个月计算连续天数

-- 某个人连续时间分段查询(不同的连续时间段),其中row_number()是数据所在的行数,

--to_number(to_char(d1,'dd'))-row_number() 取当前时间的每月天数减row_number(),只适用于每月的计算

--如果在不同的月份,算出来就不准,而且row_number()是负数

--需要理解的是,取当前时间的天数减去当前数据的行数,这是利用一个差相等的思想:

--由于使用了时间排序,相差一天的数据(必须已经过滤重复)的行数(row_number())相差是1,如果使用当前时间的天数减去行数的差是一样的,证明是连续的,

--因为当前的时间相差一天,而行数也是相差一,相减之后差就是一样的。

--如年龄差一样,今年父亲是30岁,儿子是10,相差20,再过20年,他们的年龄差还是20,不会变。

with t1 as

(

select distinct TO_DATE(TO_CHAR(LOGIN_TIME, 'YYYY-MM-DD'),'YYYY-MM-DD') d1 from user_login where pid=5

)

select gn,min(d1) start_time,max(d1) end_time,count(*) days

from(

select d1,to_number(to_char(d1,'dd'))-row_number() over(order by d1) gn from t1

)group by gn order by 2

;

方法三:建议使用这个吧,比较通用,可以跨月使用,可以分段查询,能查询某个时间段内最大的连续天数

-- 某个人分段查询(不同的连续时间段),其中row_number()是数据所在的行数,

-- 转换成天数相减,适用于所有的时间段,可以跨月份统计连续天数

----select TO_DATE('2016-11-11', 'YYYY-MM-DD')-TO_DATE('1970-01-01', 'YYYY-MM-DD') from dual;--17115--计算天数

--需要理解的是,取从1970-01-01到现在的天数减去当前数据的行数,这是利用一个差相等的思想:

--由于使用了时间排序,相差一天的数据(必须已经过滤重复)的行数(row_number())相差是1,使用现在的天数减去行数的差是一样的,证明是连续的,

--因为天数相差一天,而行数也是相差一,相减之后差就是一样的。

--如年龄差一样,今年父亲是30岁,儿子是10,相差20,再过20年,他们的年龄差还是20,不会变。

--这个方法比上面那个方法更加通用,可以跨月份统计连续天数

with t1 as

(

select distinct TO_DATE(TO_CHAR(LOGIN_TIME, 'YYYY-MM-DD'),'YYYY-MM-DD') time_value from user_login where pid=5

)

select gn,min(time_value) start_time,max(time_value) end_time,count(*) days

from(

select time_value,to_number(time_value-TO_DATE('1970-01-01', 'YYYY-MM-DD'))-row_number() over(order by time_value) gn from t1

)group by gn order by 2

;

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>..

蕃薯耀 2016年11月25日 14:28:00 星期五

http://fanshuyao.iteye.com/

oracle中连续天数计算,Oracle计算连续天数,计算连续时间,Oracle连续天数统计相关推荐

  1. oracle中如何格式化输出,【学习笔记】数据库日期时间格式化输出案例

    天萃荷净 分享一篇关于开发DBA在工作中常用到的日期时间格式化输出方法案例,含:mysql.sql server.oracle 3种数据库日期时间格式化输出 1.mysql数据库时间格式化输出 DAT ...

  2. 在Oracle中不通过存储过程一次执行多条SQL语句Oracle PL/SQL

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL ...

  3. Oracle查询所有序列;[oracle中如何创建表的自增ID(通过序列);oracle sql语句大全

    Oracle查询所有序列 oracle sql语句大全 oracle中如何创建表的自增ID(通过序列)

  4. oracle命令清空数据库表,Oracle中如何快速删除数据字典管理的表空间-数据库专栏,ORACLE...

    我的测试环境:hp rp7410主机,hp-unix11.11 os,oracle8.1.7.4的数据库,一个有90张表大约100g的测试表空间tbs_test. 问题的提出:oracle中在使用dr ...

  5. oracle中sql命令分为几类,常用的SQL命令和ORACLE命令对比

    ---------数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1)  value from dual 2.取整(大) S:select ceilin ...

  6. oracle 表空间初始分配,在 Oracle 中创建用户时,若未提及 DEFAULT TABLESPACE 关键字,则 Oracle 就将 ( )表空间分配给用户作为默认表空间。...

    [多选题]现代职业高尔夫运动,主要有如下构成要素,即:高水平的职业球员.( ).观众的积极参与.( )和( ). [判断题]凝点较高的含蜡原油,凝点附近粘温曲线很陡,经济进站油温常略高于凝点.( ) ...

  7. oracle 表空间初始分配,在Oracle中创建用户时,若未提及DEFAULT TABLESPACE关键字,则Oracle就将哪个表空间分配给用户作为默认表空间。...

    13.现代化店员管理包括 工程分包协议书中分包人应向承包人承诺,履行总包合同中与分包合同有关的承包人的 ( ) 义务. 工程分包协议书中分包人应向承包人承诺,履行总包合同中与分包合同有关的承包人的 ( ...

  8. Postgresql中,计算两个日期月份差值或年月日,实现Oracle中months_between、add_months的效果

    Oracle中存在months_between.add_months函数,用作计算年龄等,例如计算某个人的年龄:岁(age)-月(monthss)-天(days) SELECT rowid,a.fid ...

  9. Oracle中各个命中率的总结及调优笔记整理

    Oracle中各个命中率的总结及调优笔记整理 关于Oracle中各个命中率的计算以及相关的调优 1)Library Cache的命中率: .计算公式:Library Cache Hit Ratio = ...

  10. Oracle中日期函数的使用

    相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计.那在oracle中应该怎么来写sql语句呢,这个时候Oracle的日期函数会给我们很多帮 ...

最新文章

  1. Thrift源码解析--TBinaryProtocol
  2. 检验Xcode是否被改动过的简单方法,不妨试试!!!
  3. 魔兽世界高法伤技能列表
  4. 复制表数据和结构的方法
  5. Zabbix的聚合图形配置
  6. Nginx-基础使用
  7. python dlib caffe人脸相似度_基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表...
  8. vba vbscript.regexp加载dll错误_TFS金钥匙系列04期:WPS 加载项之“团队”功能
  9. 【java】java JUC 同步器框架 AQS AbstractQueuedSynchronizer源码图文分析
  10. 2017河北对口计算机试题,2017河北省对口升学计算机专业理论试题(附答案解析).doc...
  11. Facebook 公司:如何清除 960 万句“脏话”?
  12. 相似图片搜索的原理(二)(转)
  13. 抓包工具——【Mac】Charles的下载和安装
  14. CEC2018:动态多目标测试函数DF6~DF9的PS及PF(提供Matlab代码)
  15. R语言使用cph函数和rcs函数构建限制性立方样条cox回归模型、使用cox.zph函数执行PH检验、检验模型是否满足等比例风险
  16. 嘟嘟牛app算法hook
  17. platform device和platform driver
  18. 完全零基础,如何系统地学习视频剪辑
  19. Node.js 入门
  20. Nginx服务器配置虚拟主机的步骤

热门文章

  1. word中快捷键整理
  2. win7软件图标异常解决
  3. App进行内测麻烦吗?如何进行App内测?
  4. 小程序swiper制作分门别类的轮播
  5. cdh cm 大数据系统hadoop快速安装
  6. Java POST JSON 数据处理异常 (code 160)): was expecting double-quote to start field name
  7. 硬盘出现坏道以及处理方法
  8. 8421 BCD码 加减校正
  9. Matlab的eval函数
  10. 微信屏蔽网址解决办法:实现被微信屏蔽的网址在微信内正常访问