Игра с датой и временем в SQL Server - PullRequest
0 голосов
/ 11 января 2011

Я создаю отчет SSRS.

В этом отчете неделя всегда начинается с понедельника по воскресенье.
И я хочу узнать даты начала и окончания предыдущих двух недель.

Например,

Если текущая дата = 1 января 2011 года
- текущая неделя = 27 декабря 2010 года по 2 января 2011 года
- предыдущая неделя = 20 декабря 2010по состоянию на 26 декабря 2010 г.

Я пробовал следующее, но кажется, что оно не работает, когда текущий день = воскресенье

DECLARE @DT DATETIME
DECLARE @Offset INT
DECLARE @CM DATETIME
DECLARE @PM DATETIME
DECLARE @PS DATETIME

--SET @DT = GETDATE()
SET @DT = '11/14/2010' -- Monday
SET @Offset = (DATEPART(WEEKDAY, @DT) - 2) * -1
SET @CM = DATEADD(DAY, @Offset, @DT)
SET @PM = DATEADD(DAY, -7, @CM)
SET @PS = DATEADD(DAY, -1, @CM)

SELECT @Offset AS Offset, @DT AS Date, @CM AS Monday, @PM AS [Previous Monday], @PS AS [Previous Sunday], DATEPART(WK, @PM) AS Week

Как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 11 января 2011

Добавьте таблицу [Calendar] в свою БД со всеми предварительно рассчитанными датами.Затем можно включить поля с названием дня, номером, праздником и т. Д. И просто найти нужные значения.

Это гораздо проще, чем играть с DATEADD

Полезная статья в календаретаблицы: Почему я должен рассмотреть возможность использования вспомогательной таблицы календаря?

1 голос
/ 11 января 2011

Не уверен, что это самое элегантное решение, но вы можете сделать case-заявление со своим @offset следующим образом:

SET @offset = CASE WHEN DATEPART(weekday, @today) >= 2
                  THEN -(DATEPART(weekday, @today) - 2)
                  ELSE -(DATEPART(weekday, @today) + 5)
               END

Я считаю, что это работает для всех случаев.

...