Sql server 如何将一周与周一分开

Sql server 如何将一周与周一分开,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有个问题,如何按月份划分星期。实际上,我的一周从周一开始,sql server的一周从周日开始,这就产生了问题。我必须写代码,所以如果用户给出的开始日期和结束日期之间的日期差大于30而小于90,那么日期应该在几天和几周内分开。这是这样做的- 首先,我必须找出开始日期是什么如果开始日期是星期一,那么除了第一次我必须找出我找到的前一个星期一是什么时候- declare @enddate date = '2015-08-01'; select convert (date

我有个问题,如何按月份划分星期。实际上,我的一周从周一开始,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-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
它显示了11月1日至7日之间所有日期的第0周

有人能帮我解释为什么它显示的是第0周而不是第2周,因为我的一周从周一开始,2015年11月从周日开始,所以只有一天应该是第1周,11月2日到11月8日应该是第2周 欢迎任何帮助,如果你不明白,请发表评论。我也尝试过谷歌,也尝试过这个网站,但没有找到任何东西

编辑-想要一个逻辑,这样我就可以把一周从周一分到周日,但我不能得到它作为-

如果一个月中的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

问题在于你计算每月一周的方式

这将为您提供所需的结果:

    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'; 
-使用自定义项

SELECT  @startdate as "Start date",  'Week ' + cast(dbo.WeekOfMonth(@startdate) as NVARCHAR) + ' ' + DATENAME(MONTH,@ENDDATE)
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)
-不使用自定义项

SELECT  @startdate as "Start date",  'Week ' + cast(dbo.WeekOfMonth(@startdate) as NVARCHAR) + ' ' + DATENAME(MONTH,@ENDDATE)
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)

这将提供正确的输出:

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

正如所贴的,这没有多大意义。有很多文本,但它没有清晰地描述您正在尝试做的事情。我不明白它何时开始/我看不到开始日期。您能否添加带有开始和结束日期及其各自输出的清晰示例。您当前的示例现在没有太多意义。您能再次检查它吗?您希望您的计算是基于mobday是一周的第一天这一事实吗?@JulienVasseur 11月3日的它应该显示第2周,您运行的日期,它也显示第1周,因为我在n varchar之前添加了1,因此我的整个代码已更改…因此我不希望它也显示错误的星期日期…我希望第2周显示日期='2015-9-7',第2周显示@enddate='2015-11-05';Nops man实际上问题是11月,你也可以检查日期2015-11-01,显示的是10月4日,也显示的是2015-11-02,这显示的是第1周,应该是第2周,很抱歉,但在我的数据库中,concat被确认为内置功能,你能用另一种方式发布吗?我的输入是唯一的日期而不是日期时间,你能给我吗简单选择我不知道将如何使用,因为我有很多案例场景,我不能一直使用该功能。抱歉,请你帮我们做一下。事实上,在我的示例中,这是第3周,因为这周没有满,所以我们将下周日作为第二天,然后我们可以得到完整的一周,因为下一天是星期一,从那里我们可以计算整个星期。对不起,我更改了样本,您可以查看。是的,两者的周数应与11月2日的周数相同,20151101应为第1周,20151109应为第3周。OK。我会更新我的答案,你应该更新你的样本。这是不正确的20151105。事实上,我想像如果开始日期是星期一,结束日期是星期日,那么只有一周应该显示,而不是其余的日子应该显示,所以在我的样本中,你可以看到