现在有一个计算用户连续上班天数的报表,发现通过用row_number分析函数可以完美计算这个问题。

这个SQL可以解决计算用户连续登陆、签到、上班、旷工等问题。首先将row_number按照日期排序

将日期的日,比如2016-7-1,将1截取出来转换成数字

把这个日期数字减去row_number计算出来值,作为分组号,因为不连续的值算出来的分组号就不一致;

根据分组号字段进行group by,可以算出每段连续上班的开始、结束时间、天数

如原数据是这样的

2016/7/1

2016/7/2

2016/7/4

2016/7/5

2016/7/6

2016/7/7

计算出来的结果是

分组号   开始时间    结束时间    天数

0    2016/7/1    2016/7/2    2

1    2016/7/4    2016/7/9    6

下面上代码with t1 as

select date'2016-7-1' d1 from dual

union

select date'2016-7-2' d1 from dual

union

select date'2016-7-4' d1 from dual

union

select date'2016-7-5' d1 from dual

union

select date'2016-7-6' d1 from dual

union

select date'2016-7-7' d1 from dual

union

select date'2016-7-8' d1 from dual

union

select date'2016-7-9' d1 from dual

union

select date'2016-7-11' d1 from dual

union

select date'2016-7-12' d1 from dual

union

select date'2016-7-13' d1 from dual

union

select date'2016-7-14' d1 from dual

union

select date'2016-7-18' d1 from dual

union

select date'2016-7-19' d1 from dual

select gn,min(d1),max(d1),count(*)

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分析函数可以完美计算这个问题。这个SQL可以解决计算用户连续登陆、签到、上班、旷工等问题。首先将row_number按照日期排序将日期的日,比如2016-7-1,将1截取出来转换成数字把这个日期数字减去row_number计算出来值,作为分组号,因为不连续的值算出来的分组号就不一致;根据分组号字段进行group by,可以算出每段... 一、 计算 天数 : 在 Oracle 中,两个日期相减,直接可以得到 天数 : 1 select to_date('08/06/2015','mm/dd/yyyy')-to_date('07/01/2015','mm/dd/yyyy') from dual; 返回结果:36 二、 计算 月数: 计算 月数,需要months_between函数; 1 --mo...
Oracle 使用日期函数TO_CHAR和TO_DATE来 计算 两个日期字段之间的 天数 。可以使用以下SQL语句来 计算 :SELECT TO_CHAR(TO_DATE('date1','dd-mm-yyyy') - TO_DATE('date2','dd-mm-yyyy')) AS no_of_days FROM dual;
Oracle 中,你可以使用 `EXTRACT` 函数来提取出生日期中的年份信息,然后再使用 `TRUNC` 函数将当前日期中的年份信息取整,最后两者相减即可得到年龄。 例如,假设你有一个名为 `person` 的表,其中包含一个名为 `birth_date` 的日期字段,你可以使用以下 SQL 语句 计算 出每个人的年龄: SELECT TRUNC(EXTRACT(YEAR FROM SYSDATE)) - TRUNC(EXTRACT(YEAR FROM birth_date)) AS age FROM person; 这条语句会返回一个名为 `age` 的列,其中包含每个人的年龄。 注意:这种方法只能 计算 出整年龄,如果想要精确 计算 每个人的年龄(包括月份和 天数 ),则需要使用更复杂的方法。