21-20周期的工作日

时间:2016-12-02 11:30:15

标签: sql oracle

首先,我很抱歉我的英语,因为它不是我的第一语言,但我尝试了。

在最后几天,我找到了一个计算工作天数(查询1)的查询,但是我有一个问题需要计算时间是21-20。我创建了一个案例来自动计算期间的第一天和最后一天(21-20)并且工作正常。

- 查询1

SELECT  SUM(DECODE(TO_CHAR((SYSDATE-ROWNUM),'DY'),'SUN',0,'SAT',0,1)) 
FROM    all_objects
WHERE   ROWNUM <= LAST_DAY(SYSDATE) - SYSDATE

- 查询2

SELECT  CASE
        WHEN TO_CHAR(SYSDATE, 'DD') <= '20' THEN '21/'||TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'MM/YYYY')
        ELSE '21/'||TO_CHAR(SYSDATE, 'MM/YYYY')
    END FIRST_DAY
    , CASE
         WHEN TO_CHAR(SYSDATE, 'DD') <= '20' THEN '20/'||TO_CHAR(SYSDATE, 'MM/YYYY')
         ELSE '20/'||TO_CHAR(ADD_MONTHS(SYSDATE, +1), 'MM/YYYY')
    END LAST_DAY
FROM DUAL

现在,最大的问题是如何将查询2放入查询1中?我尝试了几次但没有工作! 随意对我的代码进行任何更改。 再次,抱歉我的英国穷人。 谢谢!

修改

查询2内部查询1确定!现在问题是结果,因为这返回21而不是22.我不会在此查询中输入+1而是

- 查询1内的查询2

SELECT  SUM(DECODE(TO_CHAR((TO_DATE(CASE
                                     WHEN TO_CHAR(SYSDATE, 'DD') <= '20' THEN '20/'||TO_CHAR(SYSDATE, 'MM/YYYY')
                                     ELSE '20/'||TO_CHAR(ADD_MONTHS(SYSDATE, +1), 'MM/YYYY')
                                END)-ROWNUM),'DY'),'SUN',0,'SAT',0,1))
FROM    all_objects
WHERE   ROWNUM <= TO_DATE(CASE
                         WHEN TO_CHAR(SYSDATE, 'DD') <= '20' THEN '20/'||TO_CHAR(SYSDATE, 'MM/YYYY')
                         ELSE '20/'||TO_CHAR(ADD_MONTHS(SYSDATE, +1), 'MM/YYYY')
                      END) 
                     - TO_DATE(CASE
                                  WHEN TO_CHAR(SYSDATE, 'DD') <= '20' THEN '21/'||TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'MM/YYYY')
                                  ELSE '21/'||TO_CHAR(SYSDATE, 'MM/YYYY')
                               END)

- 结果:21

修改

在数据库中有一个工作日表。我可以用它来计算,但我不知道如何使用21-20这样的时间段(例如2016年11月21日至2016年12月20日之间)。

select  * 
from    pcdiasuteis 
where   pcdiasuteis.data >= '01/01/2017’

- 结果

Row #   CODFILIAL   DATA        DIAFINANCEIRO   DIAVENDAS
1       1           01/01/2017  N               N        
2       1           02/01/2017  S               S        
3       1           03/01/2017  S               S        
4       1           04/01/2017  S               S        
5       1           05/01/2017  S               S        
6       1           06/01/2017  S               S        
7       1           07/01/2017  N               N        
8       1           08/01/2017  N               N        

- DIAFINANCEIRO是财务日历,DIAVENDAS是销售日历。

修改

天啊,我太傻了!这比我想象的要简单得多。

- 查询

SELECT  COUNT(PCDIASUTEIS.DATA) DIAS_TRABALHO
FROM    PCDIASUTEIS 
WHERE   PCDIASUTEIS.DIAVENDAS = 'S'
    AND PCDIASUTEIS.CODFILIAL = 1
    AND PCDIASUTEIS.DATA BETWEEN (CASE
                                     WHEN TO_CHAR(SYSDATE, 'DD') <= '20' THEN '21/'||TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'MM/YYYY')
                                     ELSE '21/'||TO_CHAR(SYSDATE, 'MM/YYYY')
                                  END) AND (CASE
                                               WHEN TO_CHAR(SYSDATE, 'DD') <= '20' THEN '20/'||TO_CHAR(SYSDATE, 'MM/YYYY')
                                               ELSE '20/'||TO_CHAR(ADD_MONTHS(SYSDATE, +1), 'MM/YYYY')
                                            END)

但问题仍然存在,因为我不想在其他情况下使用WorkDay表。

0 个答案:

没有答案