代码之家  ›  专栏  ›  技术社区  ›  Liam neesan

在我使用SQL Server的情况下,如何使用周数获取周的开始日期和结束日期?

  •  0
  • Liam neesan  · 技术社区  · 7 年前

    实际上,当我检查周数的日期

    select datepart(wk,'2016-01-02')  //Saturday
    
    output: 1
    
    select datepart(wk,'2016-01-03')  //Sunday
    
    output: 2
    

    但当我用周数得到周的开始日期和结束日期时,它显示的不同。

    DECLARE @weekStart INT
    DECLARE @weekEnd INT
    DECLARE @Year INT
    
    set @weekStart = 1
    set @Year = 2016
    
    DECLARE @WeekStartDate date
    DECLARE @WeekEndDate date
    
    SET @WeekStartDate = convert(date,DATEADD (WEEK, @weekStart, DATEADD (YEAR, @Year-1900, 0)) - 4 -
                                                    DATEPART(DW, DATEADD (WEEK, @weekStart, DATEADD (YEAR, @Year-1900, 0)) - 4) + 1)
    SET @WeekEndDate =convert(date,DATEADD (WEEK, @weekStart+1, DATEADD (YEAR, @Year-1900, 0)) - 4 -
                                                    DATEPART(DW, DATEADD (WEEK, @weekStart+1, DATEADD (YEAR, @Year-1900, 0)) - 4) + 1)
    
    select @WeekStartDate,@WeekEndDate
    
    
    output: 
      StartingDate    EndingDate
      --------------------------
      2016-01-03      2016-01-09
    

    我期望的输出是,如果我给week=1,它应该给 2016-01-01 和**结束日期= 2016-01-02

    对于第2周,它应该给出 2016-01-03 2016-01-09

    2 回复  |  直到 7 年前
        1
  •  1
  •   Alberto Martinez    7 年前

    create procedure spWeekDates @year int, @week int
    as
    declare @firstWeekDay int
    declare @yearStart datetime, @weekStartDate datetime, @weekEndDate datetime
    
    set datefirst 7 -- change as needed
    set @yearStart=cast(@year as char(4))+'0101' -- years always start on 01/01 [citation needed]
    set @firstWeekDay=datepart(weekday,@yearStart)
    
    -- absolute start/end dates
    set @weekStartDate=dateadd(week,@week-1,@yearStart)-@firstWeekDay+1
    set @weekEndDate=dateadd(day,6,@weekStartDate)
    -- adjusting for target year
    if year(@weekStartDate)<@year set @weekStartDate=@yearStart
    if year(@weekEndDate)>@year set @weekEndDate=cast(@year as char(4))+'1231'
    
    select @weekStartDate as WeekStartDate, @weekEndDate as WeekEndDate
    go
    
    exec spWeekDates 2016,1
    exec spWeekDates 2016,2
    exec spWeekDates 2016,53
    go
    

    结果:

    |       WeekStartDate |         WeekEndDate |
    |---------------------|---------------------|
    | 2016-01-01 00:00:00 | 2016-01-02 00:00:00 |
    
    |       WeekStartDate |         WeekEndDate |
    |---------------------|---------------------|
    | 2016-01-03 00:00:00 | 2016-01-09 00:00:00 |
    
    |       WeekStartDate |         WeekEndDate |
    |---------------------|---------------------|
    | 2016-12-25 00:00:00 | 2016-12-31 00:00:00 |
    
        2
  •  0
  •   Ilyes    7 年前

    你必须得到一年中第一天的星期几
    如果它不等于1,那么你必须 set @weekStart = @weekStart -1
    set @StartingDate = first day in year