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

您要求计算两个日期之间的天数?为什么需要第二个表?您是否“拥有”了它,还是因为您认为它可能有助于解决问题而构建了它?此外,您是否需要输出中的两列(包括和不包括雇用日期)?其中一个是否足够?您要求计算两个日期之间的天数?为什么需要第二个表?您是否“拥有”了它,还是因为您认为它可能有助于解决问题而构建了它?此外,您是否需要输出中的两个列(包括和不包括雇用日期)?其中一个是否足够?