2015-10-14 141 views
1

我有一個問題,如何按月拆分星期。實際上,我的周從星期一開始,在sql server周從星期天開始,這就產生了這個問題。如果用戶提供的開始日期和結束日期的日期差異超過30且小於90,我必須編寫代碼,以便日期在幾天和幾周內分開。這是這樣完成的 - 首先我必須找到是什麼,如果開始日期適逢星期一,然後它的好以外第一我一定要找到什麼時候是上週一爲了這個,我發現 -如何從星期一拆分星期

declare @enddate date = '2015-08-01';    
select convert (date, DATEADD(wk, DATEDIFF(wk, 0,@enddate),0)) 

但它不會,如果開始工作的開始日期日期是爲了這個,我已經添加了一個變量,它會檢查是什麼日子開始一天,如果是星期天,然後我把它設置爲1,然後我改變了我的代碼─(週日只)

declare @enddate date = '2015-08-02';    
select convert (date, DATEADD(wk, DATEDIFF(wk, 6,@enddate),0)) 
週日210

對我來說,主要的問題是幾周內如何分手。我按給定的代碼分裂了幾周。 這是例如日期

declare @enddate date = '2015-11-03';  
SELECT 'Week ' + CAST(DATEPART(WEEK,@ENDDATE) 
- DATEPART(WEEK,DATENAME(YEAR,@ENDDATE) + '/' 
+ DATENAME(MONTH,@ENDDATE) + '/' + '1') AS NVARCHAR)+ ' ' + DATENAME(MONTH,@ENDDATE) 

是 -

Week 0 November 

而且它顯示0周,1和7之間的所有日期十一月

誰能幫助我,爲什麼它顯示本週ouptut 0不是第2周,因爲我的星期從星期一和2015年11月開始,因此只有一天應該是第1周,並且從11月2日到11月8日應該是第2周 歡迎任何幫助,請評論,如果你不瞭解我也試圖去拋媚眼並試用了此網站本身第一,但不找到任何

EDITED-希望有一個邏輯,這樣我就可以一週從週一分裂到週日,但我不能把它原樣

如果一個月改變在幾個星期之間,一個月中的30個是星期二,因此這個星期只應在這裏結束,下個月1將在星期三現在從週三到週日開始的每個月的新的一週將是該月的第一週。

在我的案例邏輯我已經得到它,但具體到2015年11月我無法得到它。

輸出須─

Start date -2015-09-07  End date-2015-11-01 

Output 
Start date          End date 
Week 2 September       Week 1 November 



Start date -2015-09-07    End date-2015-11-05 

Output - 

Start date          End date 
Week 2 September        Week 1 November 
2015-11-02         2015-11-05 

Start date -2015-09-07    End date-2015-11-08 

Output - 

Start date          End date 
Week 2 September        Week 2 November 

Start date -2015-09-08    End date-2015-11-05 

Start date          End date 
2015-09-08         2015-09-13 
Week 3 September        Week 1 November 
2015-11-02         2015-11-05 
+0

張貼這沒有很大的意義。有很多文字,但它並沒有描繪出你想要做什麼的清晰畫面。 –

+1

我不明白什麼時候開始/我看不到開始日期。你可以添加清楚的例子,開始和結束日期及其各自的輸出。你目前的例子現在沒有什麼意義。 –

+0

你能再次檢查嗎 –

回答

1

的問題是你現在的樣子月的周計算

這應該給你想要的結果:

SET DATEFIRST 1; 
go 
    alter function WeekOfMonth (@Day Date) returns int 
    as 
    begin 
     return DATEPART(wk, @Day) - DATEPART(wk, CAST(DATEADD(month, DATEDIFF(month, 0, @day), 0) AS DATE)) + 1 
    end 
    go 
    declare @startdate date = '2015-09-07'; 
    declare @enddate date = '2015-11-03'; 

- 隨着使用UDF

SELECT @startdate as "Start date", 'Week ' + cast(dbo.WeekOfMonth(@startdate) as NVARCHAR) + ' ' + DATENAME(MONTH,@ENDDATE) 

-without使用的UDF

SELECT @enddate as "End date", 'Week ' + cast(DATEPART(wk, @enddate) - DATEPART(wk, CAST(DATEADD(month, DATEDIFF(month, 0, @enddate), 0) AS DATE)) + 1 as NVARCHAR) + ' ' + DATENAME(MONTH,@ENDDATE) 
+1

但是,這兩個日期顯示錯誤的一週...我想第2周的日期='2015-9-7'和第2周@enddate ='2015-11-05'; –

+0

@AdityaShrivastava看到更新的答案。 –

+0

Nops男人其實問題是月份11月你也可以檢查日期2015-11-01它顯示的是第4周10月還2015-11-02這是它顯示的第1周應該是第2周 –

0

這給正確的輸出:

declare @data table(id int identity(0, 1), startdate date, enddate date) 
insert into @data(startdate, enddate) values 
    ('20150906', '20151101') 
    , ('20150907', '20151102') 
    , ('20150907', '20151103') 
    , ('20150907', '20151104') 
    , ('20150907', '20151105') 
    , ('20150907', '20151108') 
    , ('20150908', '20151108') 
    , ('20150908', '20151109') 


SET DATEFIRST 1 

-- days before weeks 
Select id, type = 0, startdate, enddate 
    , [Start Date] = Cast(startdate as varchar(10)), [End Date] = Cast(DATEADD(DAY, (7-DATEPART(WEEKDAY, startdate))%7, startdate) as varchar(10)) 
From @data 
Where DATEPART(WEEKDAY, startdate) <> 1 
Union All 
-- Weeks 
Select id, type = 1, startdate, enddate 
    , 'Week ' + Cast((
     DATEPART(WEEK, startdate) - DATEPART(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, startdate), 0)) + 1 + Case When DATEPART(WEEKDAY, startdate) <> 1 then 1 else 0 end 
    ) as varchar(10)) + ' ' + DATENAME(MONTH,startdate) 
    , 'Week ' + Cast(DATEPART(WEEK, enddate) - DATEPART(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, enddate), 0)) + 1 as varchar(10)) + ' ' + DATENAME(MONTH,enddate) 
From @data 
Union All 
-- Days after weeks 
Select id, type = 2, startdate, enddate 
    , cast(DATEADD(DAY, -(DATEPART(WEEKDAY, enddate)+6)%7, enddate) as varchar(10)) 
    , cast(enddate as varchar(10)) 
From @data 
Where DATEPART(WEEKDAY, enddate) <> 7 
Order By id, type 

輸出:

id type startdate enddate  Start Date   End Date 
0 0  2015-09-06 2015-11-01 2015-09-06   2015-09-06 
0 1  2015-09-06 2015-11-01 Week 2 September Week 1 November 
1 1  2015-09-07 2015-11-02 Week 2 September Week 2 November 
1 2  2015-09-07 2015-11-02 2015-11-02   2015-11-02 
2 1  2015-09-07 2015-11-03 Week 2 September Week 2 November 
2 2  2015-09-07 2015-11-03 2015-11-02   2015-11-03 
3 1  2015-09-07 2015-11-04 Week 2 September Week 2 November 
3 2  2015-09-07 2015-11-04 2015-11-02   2015-11-04 
4 1  2015-09-07 2015-11-05 Week 2 September Week 2 November 
4 2  2015-09-07 2015-11-05 2015-11-02   2015-11-05 
5 1  2015-09-07 2015-11-08 Week 2 September Week 2 November 
6 0  2015-09-08 2015-11-08 2015-09-08   2015-09-13 
6 1  2015-09-08 2015-11-08 Week 3 September Week 2 November 
7 0  2015-09-08 2015-11-09 2015-09-08   2015-09-13 
7 1  2015-09-08 2015-11-09 Week 3 September Week 3 November 
7 2  2015-09-08 2015-11-09 2015-11-09   2015-11-09 
+0

實際上在我的樣本中它是第3周,因爲一週沒有滿,所以我們會在下一個星期天作爲一天,那麼我們可以得到整整一週,因爲第二天是星期一,從那裏我們可以整週計數 –

+0

對不起,我改變了樣本你可以看看它 –

+0

是啊兩個應該有同樣的一週,11月2日和20151101應該是第1周,20151109應該是第3周 –

相關問題