2017-09-12 2 views
0

Je trouve déjà pour obtenir le numéro de la semaine mais, cela montre la date de manière différente.Comment obtenir la date de début et la date de fin des semaines en utilisant le numéro de semaine dans mon cas en utilisant SQL Server?

En fait, quand je vérifie le numéro de la semaine pour la date de

select datepart(wk,'2016-01-02') //Saturday 

output: 1 

select datepart(wk,'2016-01-03') //Sunday 

output: 2 

Mais quand je reçois la date de début et de fin date de semaines en utilisant le numéro de la semaine, il montre différents.

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 

J'attends la sortie est, si je donne la semaine = 1 il devrait donner STARTINGDATE = ** et ** 2016-01-01 EndingDate =2016-01-02

pour le numéro de la semaine 2, il devrait donner 2016-01-03 2016-01-09

+0

Je venais de faire une table de dimensions .... https: // www. mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/ – scsimon

Répondre

1

Vous pouvez obtenir le début/fin absolue de la semaine, puis ajuster pour l'année en cours le premier début de la semaine et la fin de la semaine dernière. Vous ne devez vraiment calculer le début, car la fin est de commencer + 6 jours:

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)[email protected]+1 
set @weekEndDate=dateadd(day,6,@weekStartDate) 
-- adjusting for target year 
if year(@weekStartDate)<@year set @[email protected] 
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 

Résultats:

|  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 | 
0

Vous devez vous jour de la semaine du premier jour de l'année
si elle ne correspond à 1 h, alors vous ave à set @weekStart = @weekStart -1
et set @StartingDate = first day in year