2016-11-23 8 views
0

Я ищу, чтобы узнать, есть ли способ, которым я могу рассчитать этот диапазон дат недели.Расчет диапазона дат недели

Например

Monday - 2016-11-21 
Tuesday - 2016-11-22 
Wednesday - 2016-11-23 

и так далее так далее.

Если кто-то может помочь мне с синтаксисом и расчетами, это было бы здорово.

+0

Пожалуйста, имейте в виду, что существует более одного определения для «недели». В зависимости от ваших потребностей, вы можете иметь это в виду. – Jens

+0

Привет, Йенс. Что ты имеешь в виду? Если я смогу избежать будущих проблем, я захочу. – user3482471

+1

В зависимости от региона способ изменения недели может измениться. В некоторых регионах неделя начинается в понедельник, другие - в воскресенье. Кроме того, обработка недель в год, эти реализации могут отличаться, особенно в начале и конце года. Неделя 1 не обязательно начинается с первого января, она даже может быть частью прошлогодней недели. Это довольно распространенная проблема с BI. – Jens

ответ

3

Если вы довольны ими в своих собственных колонках, вы можете сделать что-то подобное;

SELECT 
DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) Last_Monday 
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 1) Last_Tuesday 
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 2) Last_Wednesday 
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 3) Last_Thursday 

Результатж;

Last_Monday    Last_Tuesday   Last_Wednesday   Last_Thursday 
2016-11-14 00:00:00.000 2016-11-15 00:00:00.000 2016-11-16 00:00:00.000 2016-11-17 00:00:00.000 

Если вам это нужно в строках, то просто соедините результат;

SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) Date_Field, 'Last_Monday' Day_Name 
UNION 
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 1), 'Last_Tuesday' 
UNION 
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 2), 'Last_Wednesday' 
UNION 
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 3), 'Last_Thursday' 

Результат;

Date_Field     Day_Name 
2016-11-14 00:00:00.000  Last_Monday 
2016-11-15 00:00:00.000  Last_Tuesday 
2016-11-16 00:00:00.000  Last_Wednesday 
2016-11-17 00:00:00.000  Last_Thursday 

Прочтите здесь, чтобы получить хорошее объяснение того, как это работает;

DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) Can someone explain me this

+0

Привет, Rich, это сработало правильно. Я могу использовать это для того, что мне нужно. Может показаться глупым вопросом ... но могли бы вы сломать его, чтобы я мог понять, почему это сработало? – user3482471

+0

Я только что связался с сообщением, которое объясняет это довольно хорошо, дайте мне знать, если это не выяснит это для вас. –

0
DECLARE @StartDT DATE = '2016-11-21' 

;WITH CTE (_Date) 
AS (
    SELECT @StartDT 

    UNION ALL 

    SELECT DATEADD(DAY, 1, _Date) 
    FROM CTE 
    WHERE _Date < DATEADD(DAY, 6, @StartDT) 
    ) 
SELECT _Date 
    ,DATENAME(W, _Date) 
FROM CTE 
+0

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) о том, как и почему это решает проблему, действительно будет помочь улучшить качество вашей должности. Помните, что вы отвечаете на вопрос читателей в будущем, а не только на человека, который спрашивает сейчас! Измените свой ответ, чтобы добавить объяснения, и укажите, какие ограничения и допущения применяются. – Makyen

0

Вы можете установить начальную и конечную дату недели и перебирать корыта эти даты:

Declare @startDay datetime, 
     @endDay  datetime, 
     @iterDate datetime 

Set @startDay = dateadd(day, datediff(day, 0, getdate())/7 * 7, 0) --Starting day of this week 
Set @endDay = dateadd(day, 7, @startDay) 

Set @iterDate = @startDay 

Declare @tmpResults Table (Date datetime, DayName varchar(20)) 

While (@iterDate < @endDay) 

Begin 
    Insert into @tmpResults (Date, DayName) 
    Values (@iterDate, datename(weekday, @iterDate)) 

    Set @iterDate = dateadd(day, 1, @iterDate) 
End 

select Date, DayName From @tmpResults 

Результаты:

enter image description here

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