所以,我在最近几天一直坚持这个问题而且我仍然无法提出解决方案。
我希望将给定的月份分为几周,这相当容易,但(可怕的)业务要求是将一天视为一周,如果它 在星期一到星期日之间的任何一天。一周的结束日将是星期天。
例如,我将在八月份进行示威。根据业务需求,这是给定月份数据的显示方式
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 );
寻找有关问题的建议/见解。 感谢
答案 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;
示例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”的数量,就可以得出给定月份的周数