现在有一个计算用户连续上班天数的报表,发现通过用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` 的列,其中包含每个人的年龄。
注意:这种方法只能
计算
出整年龄,如果想要精确
计算
每个人的年龄(包括月份和
天数
),则需要使用更复杂的方法。