考虑周四作为周计数器的SQL Server查询,用于查找一个月的周数

时间:2017-03-21 07:18:45

标签: sql-server week-number

我需要一个月的周数。本周需要在周四开始。

我尝试了很多答案,但我在下面的条件并不令人满意。

例如:以下日期的周数是

SL  Date        Weeknumber   
---------------------------
1) 21/09/2017 - 3
2) 28/09/2017 - 4
3) 23/03/2017 - 4
4) 29/06/2017 - 5
5) 15/03/2018 - 3
6) 28/03/2018 - 4
7) 29/03/2018 - 5

提前致谢

3 个答案:

答案 0 :(得分:2)

假设你的输入表就像

TableOfDates([SL] int,[Date] date)

以下查询将给出正确的周数

set datefirst 4
go

--create table TableOfDates([SL] int,[Date] datetime)
--insert into TableOfDates values 
--(1,'09-21-2017'),
--(2,'09-28-2017'),
--(3,'03-23-2017')

select 

    t.Date,DATEPART(wk,t.[Date])- DATEPART(wk,DATEADD(d,1,DATEADD(m,-1,EOMONTH(t.[Date]))))
from TableOfDates t

go
--drop table TableOfDates
set datefirst 7
go

对于SQL SERVER 2008版本

您可以使用以下查询

select 

    t.Date,DATEPART(wk,t.[Date])- DATEPART(wk,cast(dateadd(m,datediff(m,0,t.date),0) as date))
from TableOfDates t

<强>解释

默认设置Datefirst设置为7.我们指示SQL服务器使用星期四(4)作为星期的开始。 请参阅MSDN documentation

现在,因为周年数是从年初开始计算的,我们需要每月工作周数,我们计算当前日期和月初的周数,它们的差异给出了每月周数

最后,我们将datefirst设置为默认值7

参见附件

enter image description here

答案 1 :(得分:2)

这应该会给你你想要的东西。有点疯狂,我知道,但它确实有效:

create table #months (date date);

insert into #months
values ('20170921')
    , ('20170928')
    , ('20170323')
    , ('20170629')
    , ('20180315')
    , ('20180328')
    , ('20180329');

select date
    , case 
        when weeksdif * 7 <= daysdiff
            then weeksdif + 1
        else weeksdif
        end [week nr]
from (
    select *
        , wk - wk_startOfMonth [weeksdif]
        , DATEDIFF(DAY, startOfMonth, date) [daysdiff]
    from (
        select *
            , DATEPART(wk, startOfMonth) wk_startOfMonth
            , DATEPART(WEEKDAY, startOfMonth) wkd_startOfMonth
        from (
            select *
                , DATEPART(wk, date) wk
                , DATEPART(weekday, date) wkd
                , cast( (CAST(YEAR(date) as varchar(8)) 
                        + RIGHT('0' + CAST(month(date) as varchar(8)), 2) 
                        + '01') as date) startOfMonth
            from #months
            ) result_set
        ) result_set
    ) result_set
order by date;

答案 2 :(得分:1)

使用DATAFIRST

来自MSDN: -

  

将一周的第一天设置为1到7之间的数字。

╔═══════════════════════════╦══════════════════════════╗
║           Value           ║ First day of the week is ║
╠═══════════════════════════╬══════════════════════════╣
║ 1                         ║ Monday                   ║
║ 2                         ║ Tuesday                  ║
║ 3                         ║ Wednesday                ║
║ 4                         ║ Thursday                 ║
║ 5                         ║ Friday                   ║
║ 6                         ║ Saturday                 ║
║ 7 (default, U.S. English) ║ Sunday                   ║
╚═══════════════════════════╩══════════════════════════╝

所以使用下一个代码: -

Set DATEFIRST 4
DECLARE @DATE DATETIME
SET @DATE = '2017-09-21'

SELECT DATEPART(WEEK, @DATE)  -
    DATEPART(WEEK, DATEADD(MM, DATEDIFF(MM,0,@DATE), 0)) AS WEEK_OF_MONTH

<强>结果: -

3