получить дату за неделю - PullRequest
1 голос
/ 03 апреля 2009

Мне нужны 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) в Query, а затем сгруппировал по номеру недели. Теперь мне нужны дата начала и дата окончания для сгруппированного номера недели.

- Рахил

Ответы [ 5 ]

2 голосов
/ 03 апреля 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)

Конечно, вы можете изменить это так, чтобы неделя начиналась с любого дня, который, как вы думаете, должен (Солнце, Пн?)

1 голос
/ 03 апреля 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 ;

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

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

1 голос
/ 03 апреля 2009

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

1 голос
/ 03 апреля 2009

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

См. этот вопрос для более подробной информации и кода.

0 голосов
/ 03 апреля 2009

ПОПРОБУЙТЕ ЭТОТ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...