在我使用 SQL 服务器的情况下,如何使用周数获取周的开始日期和结束日期?
How to get the Starting date and ending date of weeks using week number in my case using SQL Server?
我已经找到获取周数的方法,但是显示日期的方式不同。
实际上当我检查
日期的周数时
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
I am expecting output is, if I give week = 1 it should give StartingDate = **2016-01-01
and **EndingDate =2016-01-02
for the week number 2, it should give 2016-01-03 2016-01-09
你必须得到一年中第一天是星期几
如果它不等于 1 那么你必须 set @weekStart = @weekStart -1
和 set @StartingDate = first day in year
您可以获得周的绝对值 start/end,然后针对当年的第一周开始和最后一周结束进行调整。你真的只需要计算开始,因为结束是开始 + 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 |
我已经找到获取周数的方法,但是显示日期的方式不同。
实际上当我检查
日期的周数时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
I am expecting output is, if I give week = 1 it should give StartingDate = **
2016-01-01
and **EndingDate =2016-01-02
for the week number 2, it should give
2016-01-03 2016-01-09
你必须得到一年中第一天是星期几
如果它不等于 1 那么你必须 set @weekStart = @weekStart -1
和 set @StartingDate = first day in year
您可以获得周的绝对值 start/end,然后针对当年的第一周开始和最后一周结束进行调整。你真的只需要计算开始,因为结束是开始 + 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 |