2009-04-03 4 views
1

мне нужна неделя-Start-Date и Week-End-Date для конкретного номера недели в году (vb.net или SQL Server)дата както weekOfYear

Например, если НомерНедели = 1 и 2009 года, Я должен получить:

STARTDATE = 1/1/2009 EndDate = 1/3/2009

если НомерНедели = 2 и 2009 год, а затем:

StartDate = 1/4/2009 EndDate = 1/10/2009

Фактически я получил номер недели, используя datepart (wk, Date) в Query, после чего я сгруппировал по номеру недели. Теперь мне нужна дата начала и дата окончания для сгруппированного номера недели.

- Рахил

ответ

0

TRY ЭТУ TSQL:

DECLARE @Year int 
DECLARE @WeekNo int 
SET @Year = 2009 
SET @WeekNo = 1 

DECLARE @DaysInWeekOne int 
DECLARE @FirstOfJan smalldatetime 
DECLARE @ThirtyFirstOfDec smalldatetime 
DECLARE @StartDateDayOfYear int 
DECLARE @EndDateDayOfYear int 

--GET THE START AND END OF THE YEAR 
SELECT 
    @ThirtyFirstOfDec = Cast(('12/31/' + Cast(@Year as varchar)) as smalldatetime) 
, @FirstOfJan = Cast(('01/01/' + Cast(@Year as varchar)) as smalldatetime) 

--GET THE AMOUNT OF DAYS IN WEEK ONE 
SELECT 
    @DaysInWeekOne = 7 - (DatePart(dw, @FirstOfJan) - 1) 

--GET THE START AND END DAYOFYEAR VALUES FOR THE GIVEN WEEK 
SELECT 
    @StartDateDayOfYear = CASE WHEN ((@WeekNo-1)*7)-([email protected]) < 0 THEN 0 ELSE ((@WeekNo-1)*7)-([email protected]) END 
, @EndDateDayOfYear = ((@WeekNo-1)*7)-([email protected]) + 6 

--SELECT THE START DATE AND END DATE MAKING SURE IF THE COUNT RUNS OVER THE YEAR THAT WE SHOW THE 31/12 
SELECT 
    @Year As mYear 
, @WeekNo As WeekNo 
, dateadd(dd, @StartDateDayOfYear, (@FirstOfJan)) As StartDate 
, CASE 
     WHEN dateadd(dd, @EndDateDayOfYear, (@FirstOfJan)) > @ThirtyFirstOfDec THEN @ThirtyFirstOfDec 
     ELSE dateadd(dd, @EndDateDayOfYear, @FirstOfJan) 
    END As EndDate 
+0

Маленький Крис выиграл! Большое спасибо. Отлично работает. – 2009-04-03 21:02:45

2

Вы ищете что-то вроде этого:

Dim day As DayOfWeek = DateTime.Now.DayOfWeek 
Dim days As Integer = day - DayOfWeek.Monday 
Dim startDate As DateTime = DateTime.Now.AddDays(-days) 
Dim endDate As DateTime = startDate.AddDays(6) 

Вы можете изменить его, конечно же, так что неделя начинается с любой день вы думаете, он должен (Sun, Mon?)

1

Официально, первый день недели 1 в 2009 году - 29-12-2008, но вы можете легко урезать его до года, если хотите.

См. this question для получения более подробной информации и кода.

1

Да, в какой день начинается неделя? Воскресенье или понедельник?

datepart (dw, date) возвращает день недели (от 1 до 7), но «[t] число, произведенное в день недели, зависит от значения, установленного SET DATEFIRST, которое устанавливает первый день неделю."

Но это вернет правильную вещь, если ваша база данных правильно настроена.

OK, если она возвращает 1, мы в первый день, или в более общем плане, то первый день

1 - DatePart (с.в., дата) дней до нашей даты

Если она возвращает 7 мы в последний день недели, или в более общем плане, в последний день

7 - DatePart (с.в., дата) дней после нашей даты

мы используем DateAdd (дд, п, дата) чтобы получить дату n дней с нашей даты, так:

select 
date_column, 
datepart(wk, date_column) as week_number, 
dateadd(dd, 1 - datepart(dw, date_column),date_column) as week_start, 
dateadd(dd, 7 - datepart(dw, date_column), date_column) as week_end 
from table ; 

дает нам то, в чем мы нуждаемся.

Обратите внимание, что первый день первой недели года должен быть в предыдущем календарном году, потому что по определению начинается неделя (воскресенье или понедельник или что бы вы ни выбрали), но год может начать в любой день недели. Аналогичным образом, последний день последней недели года может быть в следующем календарном году.

Смежные вопросы