Sql 计算两段之间的天数
我有两张桌子在下面。我想数一数天数,周一到周五只在雇佣日期所属的日历月底之间 表Sql 计算两段之间的天数,sql,oracle,calendar,between,Sql,Oracle,Calendar,Between,我有两张桌子在下面。我想数一数天数,周一到周五只在雇佣日期所属的日历月底之间 表 Hire_DT Id 09/26/2018 1 表格日历: Date WorkDay(M-F) EOM WorkDay 09/26/2018 Wednesday 9/30/2018 1 09/27/2018 Thursday 09/30/2018 1 09/28/2018 Friday
Hire_DT Id
09/26/2018 1
表格日历:
Date WorkDay(M-F) EOM WorkDay
09/26/2018 Wednesday 9/30/2018 1
09/27/2018 Thursday 09/30/2018 1
09/28/2018 Friday 09/30/2018 1
09/29/2018 Saturday 09/30/2018 0
09/30/2018 Sunday 09/30/2018 0
预期结果
Hire_dt WorkDaysEndMonth WorkDaysEndMonth --counting hire_dt
09/26/2018 2 3
您可以使用以下例程(其中,
last_day
函数是一个很好的贡献者):
SQL>alter session set NLS_TERRITORY=“AMERICA”;
SQL>创建表TableA(ID int,Hire_DT date);
SQL>插入表A值(1,日期'2018-09-26');
SQL>选择sum(mod(to_char(myDate,'D'),7)时的情况)您可以使用以下例程(其中last_day
函数是一个很好的贡献者):
SQL>alter session set NLS_TERRITORY=“AMERICA”;
SQL>创建表TableA(ID int,Hire_DT date);
SQL>插入表A值(1,日期'2018-09-26');
SQL>select sum(case when mod(to_char(myDate,'D'),7)这里有一种计算方法——不使用日历表。唯一的输入数据是来自第一个表(ID和HIRE_DATE)的数据,我将其包含在WITH子句中(不是回答您问题的查询的一部分!).其他的都是计算出来的。我演示了如何计算天数,包括雇佣日期;如果不需要,请在末尾减去1
TRUNC(,'iw')
是
一周中的周一。查询计算周一和EOM之间EOM周中的天数,但不超过5天(如果EOM可能是周六或周日)。它对雇用日期进行类似的计算,但它计算从周一到雇用日期的天数不包括雇用日期。最后一部分是在雇用日期的周一和EOM的周一之间每周增加5天
with
sample_data(id, hire_date) as (
select 1, to_date('09/26/2018', 'mm/dd/yyyy') from dual union all
select 2, to_date('07/10/2018', 'mm/dd/yyyy') from dual
)
select id, to_char(hire_date, 'Dy mm/dd/yyyy') as hire_date,
to_char(eom, 'Dy mm/dd/yyyy') as eom,
least(5, eom - eom_mon + 1) - least(5, hire_date - hire_mon)
+ (eom_mon - hire_mon) * 5 / 7 as workdays
from (
select id, hire_date, last_day(hire_date) as eom,
trunc(hire_date, 'iw') as hire_mon,
trunc(last_day(hire_date), 'iw') as eom_mon
from sample_data
)
;
ID HIRE_DATE EOM WORKDAYS
---------- ----------------------- ----------------------- ----------
1 Wed 09/26/2018 Sun 09/30/2018 3
2 Tue 07/10/2018 Tue 07/31/2018 16
这里有一种计算方法——不使用日历表。唯一的输入数据是来自第一个表(ID和HIRE_DATE)的数据,我将其包含在WITH子句中(不是回答您问题的查询的一部分!).其他的都是计算出来的。我演示了如何计算天数,包括雇佣日期;如果不需要,请在末尾减去1
TRUNC(,'iw')
是
一周中的周一。查询计算周一和EOM之间EOM周中的天数,但不超过5天(如果EOM可能是周六或周日)。它对雇用日期进行类似的计算,但它计算从周一到雇用日期的天数不包括雇用日期。最后一部分是在雇用日期的周一和EOM的周一之间每周增加5天
with
sample_data(id, hire_date) as (
select 1, to_date('09/26/2018', 'mm/dd/yyyy') from dual union all
select 2, to_date('07/10/2018', 'mm/dd/yyyy') from dual
)
select id, to_char(hire_date, 'Dy mm/dd/yyyy') as hire_date,
to_char(eom, 'Dy mm/dd/yyyy') as eom,
least(5, eom - eom_mon + 1) - least(5, hire_date - hire_mon)
+ (eom_mon - hire_mon) * 5 / 7 as workdays
from (
select id, hire_date, last_day(hire_date) as eom,
trunc(hire_date, 'iw') as hire_mon,
trunc(last_day(hire_date), 'iw') as eom_mon
from sample_data
)
;
ID HIRE_DATE EOM WORKDAYS
---------- ----------------------- ----------------------- ----------
1 Wed 09/26/2018 Sun 09/30/2018 3
2 Tue 07/10/2018 Tue 07/31/2018 16
您要求计算两个日期之间的天数?为什么需要第二个表?您是否“拥有”了它,还是因为您认为它可能有助于解决问题而构建了它?此外,您是否需要输出中的两列(包括和不包括雇用日期)?其中一个是否足够?您要求计算两个日期之间的天数?为什么需要第二个表?您是否“拥有”了它,还是因为您认为它可能有助于解决问题而构建了它?此外,您是否需要输出中的两个列(包括和不包括雇用日期)?其中一个是否足够?