Игра с датой в SQL Server
-
09-10-2019 - |
Вопрос
Я создаю отчет 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
Как я могу это исправить?
Решение
Не уверен, что это самое элегантное решение, но вы можете сделать заявление о случаях с вашим @Offset, как это:
SET @offset = CASE WHEN DATEPART(weekday, @today) >= 2
THEN -(DATEPART(weekday, @today) - 2)
ELSE -(DATEPART(weekday, @today) + 5)
END
Я верю, что это работает для всех случаев.
Другие советы
Добавить [Calendar]
Таблица к вашей БД со всеми датами, которые вам нужны предварительно доказаны. Затем вы можете включить поля с дневным именем, номером, праздником и т. Д. И просто посмотреть значения, которые вам нужны.
Это намного проще, чем играть с DATEADD
Полезная статья о календарных таблицах: Почему я должен рассматривать использование вспомогательного календарного стола?