显示给定月份的周数

时间:2014-05-23 16:44:21

标签: sql oracle oracle10g

所以,我在最近几天一直坚持这个问题而且我仍然无法提出解决方案。

我希望将给定的月份分为几周,这相当容易,但(可怕的)业务要求是将一天视为一周,如果它 在星期一到星期日之间的任何一天。一周的结束日将是星期天。

例如,我将在八月份进行示威。根据业务需求,这是给定月份数据的显示方式

First week  - August 1st to August 2nd, 2015
Second week - August 3nd to August 9th, 2015
Third week  - August 10th to August 16th, 2015
Fourth week - August 17th to August 23rd, 2015
Fifth week  - August 24th to August 30th, 2015
Sixth week  - August 31st, 2015

由于第六周的发生,我对如何处理问题完全不了解。 我在AskTom上遇到了这个查询,该查询显示了5周,但在8月31日重置为1。此外,查询看起来不是一个优雅的解决方案。

select dt, to_char( dt+1, 'w' )
     from ( select to_date('1-aug-2015')+rownum dt
              from all_objects
                    where rownum < 31 );

寻找有关问题的建议/见解。 感谢

3 个答案:

答案 0 :(得分:1)

WITH x (dt)
     AS (    SELECT DATE '2015-08-01' + LEVEL - 1 dt
               FROM DUAL
         CONNECT BY DATE '2015-08-01' + LEVEL - 1 < DATE '2015-09-01')
SELECT dt,
       SUM (
          CASE
             WHEN TO_CHAR (dt, 'd') = '2'      --if the day is monday
               OR TO_CHAR (dt, 'fmdd') = '1'   --or if its the first day of the month, assign 1.
             THEN
                1
             ELSE
                0
          END)
       OVER (ORDER BY dt)
          wk_nr
  FROM x;
  1. 首先生成给定月份的所有日期。
  2. 通过将其标记为1来确定每周的开始和月份的开始。将剩余的日期标记为0.此处to_char(dt,'d')给出星期一2。但可能会根据会议的NLS区域进行更改。
  3. 现在您已经开始每周,请使用SUM计算累积总和。这为您提供了所需的周数。
  4. 示例fiddle


    <强> 更新

    看起来10g不支持带有CTE名称的column alias。删除它并尝试。

    WITH x 
         AS (SELECT ....
    

答案 1 :(得分:0)

   --TRY THIS

- 我为SYSDATE做了这件事。

   SELECT DT,
   CASE
       WHEN TO_CHAR(DT+1, 'W')='1'
            AND SUBSTR(DT,1,2)>'24' THEN '6'
       ELSE TO_CHAR(DT+1, 'W')
   END
   FROM
    (SELECT TO_DATE(SYSDATE)+ROWNUM DT FROM ALL_OBJECTS 
     );

- 你的例子中的查询。

  SELECT DT,CASE WHEN TO_CHAR( DT+1, 'w' )='1' AND SUBSTR( DT,1,2)>'24' THEN '6' ELSE    TO_CHAR( DT+1, 'w' ) END
 from ( select to_date('1-aug-2015')+rownum dt
        FROM ALL_OBJECTS
        WHERE ROWNUM < 31
      );

答案 2 :(得分:-2)

表变量的工作原理非常好:

declare @calendar table (WkDay date, DayOfWk int, YR INT, MO INT)
DECLARE @BEG_DT DATE
SET @BEG_DT='2016-12-01'
WHILE @BEG_DT <='2250-01-01'
BEGIN
    INSERT INTO @calendar VALUES (@BEG_DT, DATEPART(WEEKDAY,@BEG_DT), DATEPART(YEAR,@BEG_DT), DATEPART(MONTH,@BEG_DT))

    SET @BEG_DT=DATEADD(DAY,1,@BEG_DT)
END

SELECT *
FROM @calendar

然后计算“ dayofwk”的数量,就可以得出给定月份的周数