【问题标题】:How to split week from Monday如何从星期一分开一周
【发布时间】:2015-10-14 14:24:28
【问题描述】:

我对如何按月划分周有疑问。实际上我的一周从星期一开始,而在 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))

对我来说主要问题是如何在几周内分手。我按给定的代码划分了几周。 这是示例日期

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

【问题讨论】:

  • 正如发布的那样,这没有多大意义。有很多文字,但并没有清楚地描绘出您要做什么。
  • 我不明白它什么时候开始/我看不到开始日期。您能否添加带有开始和结束日期及其各自输出的清晰示例。您当前的示例现在没有多大意义。
  • 你能再查一下吗
  • 您希望您的计算基于 mobday 是一周的第一天这一事实?
  • @JulienVavasseur 11 月 3 日它应该显示您运行的日期的第 2 周,它也显示第 1 周,因为我在 n varchar 之前添加了 1,因此我的整个代码都改变了......所以我也不想要

标签: sql-server sql-server-2008


【解决方案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)

-不使用 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)

【讨论】:

  • 但是对于这两个日期,它都显示错误的星期...我希望第 2 周的日期 = '2015-9-7' 和第 2 周的 @enddate = '2015-11-05' ;
  • Nops 人实际上的问题是 11 月,您还可以检查日期 2015-11-01 它显示的是 10 月 4 周,也显示 2015-11-02 为这个它显示的第 1 周应该是一周2
  • 抱歉,但在我的数据库中,concat 被识别为内置功能,你能以另一种方式发布它吗?我的输入只是日期而不是日期时间
  • 你能给我简单的选择吗?我不知道如何使用,因为我有很多案例场景,我不能一直使用那个功能..对不起,但请你能做到跨度>
【解决方案2】:

这给出了正确的输出:

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

【讨论】:

  • 实际上在我的示例中是第 3 周,因为这周没有满,所以我们将去下周日作为一天,然后我们可以得到整周,因为第二天是周一,从那里我们可以计算整个周
  • 抱歉我换了样例你可以看看
  • 是的,两者都应该与 11 月 2 日的周相同,20151101 应该是第 1 周,20151109 应该是第 3 周
  • 好的。我会更新我的答案,你应该更新你的样本。 20151105 不正确。
  • 实际上我想如果开始日期是星期一,结束日期是星期日,那么应该只显示一周,而不是应该显示剩余天数,所以在我的示例中你可以看到
猜你喜欢
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多