2015-10-14 139 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周 –

相关问题