получить дату по неделям

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

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

StartDate = 1/1/2009 EndDate = 1/3/2009

если номер недели = 2 и год 2009, то:

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

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

- Рахил


person Community    schedule 03.04.2009    source источник


Ответы (4)


ПОПРОБУЙТЕ ЭТОТ 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)-(7-@DaysInWeekOne) < 0 THEN 0 ELSE ((@WeekNo-1)*7)-(7-@DaysInWeekOne) END
,   @EndDateDayOfYear = ((@WeekNo-1)*7)-(7-@DaysInWeekOne) + 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
person littlechris    schedule 03.04.2009

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

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)

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

person dommer    schedule 03.04.2009

Возможно, стоит подумать о Таблица календаря.

person Mr Plough    schedule 03.04.2009

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

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

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

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

1 - datepart (dw, date) дней до нашей даты

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

7 - datepart (dw, date) дней после нашей даты

Мы используем dateadd (dd, n, date), чтобы получить дату через 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 ;

дает нам то, что нам нужно.

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

person tpdi    schedule 03.04.2009