Sql 给定日期,选择该月包含的所有周数

Sql 给定日期,选择该月包含的所有周数,sql,oracle,oracle-apex,Sql,Oracle,Oracle Apex,我有一个跟踪工作时间的ApEx应用程序。 我有这样一个观点: CREATE OR REPLACE VIEW HOURSDAYS AS SELECT (MAX("TO_X") - MIN("FROM_X"))*24 - (max(case when PROJECT_ID = 999 then to_x else to_date('01012000','DDMMYYYY') end) - max(case when PROJECT_ID = 999 then from_x else to_

我有一个跟踪工作时间的ApEx应用程序。 我有这样一个观点:

CREATE OR REPLACE VIEW HOURSDAYS
AS SELECT
 (MAX("TO_X") - MIN("FROM_X"))*24 - 
 (max(case when PROJECT_ID = 999 then to_x else to_date('01012000','DDMMYYYY') end) -
  max(case when PROJECT_ID = 999 then from_x else to_date('01012000','DDMMYYYY') end))*24 AS TIME_SPENT,
 DAY,
 PERSON_ID
 FROM ATTENDANCE_HOURS
 GROUP BY PERSON_ID, DAY
 ORDER BY DAY DESC
我需要每周小时数的总和。所以我有这个:

SELECT TO_CHAR(DAY,'IW'), MIN(DAY), MAX(DAY), SUM(TIME_SPENT)
FROM HOURSDAYS
WHERE PERSON_ID = (SELECT ID FROM ATTENDANCE_PEOPLE WHERE MAIL_SSO = V('APP_USER') AND ROLE = 0) AND
EXTRACT (YEAR FROM DAY) = EXTRACT (YEAR FROM TO_DATE(:P100_DATE_PICKER,'DD-MON-RR')) 
GROUP BY TO_CHAR(DAY,'IW')
ORDER BY TO_CHAR(DAY,'IW') ASC 
现在,有趣的事情开始了:我有一个页面项P100_DATE_PICKER,我只需要显示那些日期大于0天的周,这些周属于我使用日期选择器选择的日期所属的月份。 例如,对于2015年1月1日,我只希望显示第1、2、3、4、5周。2015年3月24日:9、10、11、12、13、14

如果有人对我为什么要这样做感兴趣,这是为了验证——每周的工作时间不能超过20/32,这取决于你的合同类型。

你可以这样做:

where day >= trunc(trunc(TO_DATE(:P100_DATE_PICKER,'DD-MON-RR'), 'MM'),'IW')
  and day <  trunc(last_day(TO_DATE(:P100_DATE_PICKER,'DD-MON-RR')),'IW') + 7
第一行从trunc到MM,它给出了日期当月的第一天。然后trunc再次向IW提供包含一个月第一天的一周中的星期一的日期


第二行使用last_day获取日期当月的最后一天。然后trunc到IW得到该周的星期一,再加上7天得到下一周的星期一。然后,通过使用实现最后一部分的最佳方法是创建一个包含以下列的日历表

日期,如周一,月,季度,年,周

然后,对于给定的日期,您只需选择属于该月的所有周

这允许您定义weekNo,以便它适合公司的情况。偶尔你会得到一年53周的假期,特别是如果他们有4-4-5个会计周期

with days as (
  select 
      to_number(to_char(trunc(to_date('2015-03-24', 'yyyy-MM-dd'), 'month'), 'WW')) w1, 
      to_number(to_char(last_day(to_date('2015-03-24', 'yyyy-MM-dd')), 'WW')) w2 
    from dual)
select w1+level-1 week from days 
  connect by level <= w2-w1+1

子查询天提供最小和最大周,使用connect by的查询返回这些值之间的数字。请将示例日期替换为:P100\u date\u PICKER。

这不会回答您的所有问题。这是根据问题主题行从给定日期开始计算周数的快速示例。请复制/粘贴以查看结果。此外,以下是查看周数的链接:


这可能是有用的,是的。对于特定问题,需要首先选择属于该月的周,然后选择属于这些周的所有日期,因为其中一些日期属于上一个月或下一个月,为了显示一周中的所有工作时间,还需要包含它们。因此,您添加了一个包含yyyymm的月代码列。因此,当您选择月份时,它会返回yyyymm代码,然后您会查找属于月份的周。我不确定您的意思:24.3.2015:9、10、11、12、13、14。三月份有五个星期日和五个星期一,那你为什么要展示六个星期呢?@Davidaber第九周是从2015-02-23到2015-03-01,所以部分时间是在三月份。第14周是从2015年3月30日到2015年4月5日,部分时间也是在3月份。据我所知,要求部分或全部显示所需月份的所有周,并显示这些周的所有数据。因此,3月份的数据显示从2015年2月23日到2015年4月05日,按这6周分组。
SELECT given_date
 , end_date
 , TRUNC(calc_start_date, 'iw')                  wk_starts  
 , TRUNC(calc_start_date, 'iw') + 7 - 1/86400    wk_ends 
 , TO_CHAR(calc_start_date, 'iw')                wk_number
 , calc_start_date
FROM 
(
 SELECT trunc(sysdate, 'mm')                     given_date
 , trunc(sysdate, 'mm')-7 + LEVEL*7 AS      calc_start_date
 , Last_Day(trunc(SYSDATE, 'mm'))           end_date
FROM dual
CONNECT BY LEVEL <= ROUND((trunc(last_day(sysdate)) - trunc(sysdate, 'mm')+7)/7) -- number of weeks --
)
/
GIVEN DATE  END DATE    WK_STARTS     WK_ENDS                 WK NUMBER
-------------------------------------------------------------------------
1/1/2015    1/31/2015   12/29/2014    1/4/2015  11:59:59 PM   01
1/1/2015    1/31/2015   1/5/2015      1/11/2015 11:59:59 PM   02
1/1/2015    1/31/2015   1/12/2015     1/18/2015 11:59:59 PM   03
1/1/2015    1/31/2015   1/19/2015     1/25/2015 11:59:59 PM   04
1/1/2015    1/31/2015   1/26/2015     2/1/2015  11:59:59 PM   05