【问题标题】:How to get the Starting date and ending date of weeks using week number in my case using SQL Server?在我使用 SQL Server 的情况下,如何使用周数获​​取周的开始日期和结束日期?
【发布时间】:2017-09-12 21:03:41
【问题描述】:

我已经找到了获取周数,但是它以不同的方式显示日期。

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

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 它应该给 StartingDate = **2016-01-01 和 **EndingDate =2016-01-02

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

【问题讨论】:

标签: sql sql-server date stored-procedures week-number


【解决方案1】:

您可以获取一周的绝对开始/结束时间,然后针对当前年份调整第一周开始和最后一周结束。您只需要计算开始,因为结束是开始 + 6 天:

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】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2022-01-07
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多