首先,我很抱歉我的英语,因为它不是我的第一语言,但我尝试了。
在最后几天,我找到了一个计算工作天数(查询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表。