Как я могу сделать динамический запрос SQL Server со скользящими датами, но определенное время? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь сделать динамический запрос, который ищет записи от 9 дней назад в 21:00 до 2 дней назад в 23:00.

Меня попросили сделать еженедельный отчет в Maximoв котором перечислены все записи между воскресеньями в 21:00 и следующими пятницами в 23:00.Отчет должен генерироваться каждую неделю по вторникам в 6:00.Я собрал что-то вместе из других запросов, но не могу понять, куда идти дальше:

startdatetime >= dateadd(hour, 21, dateadd(dd, datediff(dd, 0, getdate()), 0))
and startdatetime <= dateadd(hour, 23, dateadd(dd, datediff(dd, 0, getdate()), 0))

Я использовал DATEADD прежде, чтобы показать все записи между определенными моментами текущего дня.То, что я не могу понять, - как получить те времена для предыдущих дат.Я пытался сделать "... dateadd (dd, datediff (dd, 0, getdate () - 9), 0) и ... dateadd (dd, datediff (dd, 0, getdate () - 2), 0)", но я получил код ошибки SQL 207. Очевидно, я не понимаю, как работает второй сегмент DATEADD.Может кто-нибудь показать мне, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Использование 0 в качестве основы (что соответствует 1900-01-01) не очень интуитивно понятно или самодокументировано.Кроме того, написание запроса, предполагающего, что он будет выполняться только во вторник, немного опасно;мы можем сделать так, чтобы при необходимости повторного запуска в среду или четверг он все равно давал правильные результаты.

-- first, let's make sure we know what weekday is a Sunday
DECLARE @OriginalDateFirst int = @@DATEFIRST;

IF @OriginalDateFirst <> 7
BEGIN
  SET DATEFIRST 7;
END

-- let's figure out today
DECLARE @today datetime = CONVERT(date, GETDATE()),
        @weekday int = DATEPART(WEEKDAY, GETDATE());

-- if weekday is 3 (Tuesday), the previous Sunday is today -2, 
-- and the Sunday before that is today -9

-- if weekday is 4 (Wednesday), the days are -3, -10
-- if weekday is 5 (Thursday),  the days are -4, -11
-- and so on

-- so the range is -6-@weekday to 1-@weekday
DECLARE @MostRecentSunday datetime = DATEADD(HOUR, 23, DATEADD(DAY,  1-@weekday, @today)),
        @PreviousSunday   datetime = DATEADD(HOUR, 21, DATEADD(DAY, -6-@weekday, @today));

-- make sure this is what you want:
SELECT @PreviousSunday, @MostRecentSunday;

-- now your query just says:
... WHERE startdatetime >= @PreviousSunday
      AND startdatetime <= @MostRecentSunday;

-- let's put the datefirst setting back
IF @OriginalDateFirst <> 7
BEGIN
  SET DATEFIRST @OriginalDateFirst;
END

Да, это определенно больше кода (хотя вы можете сжать его совсем немного, если вынапример, и если вы знаете, что никто не ошибается с DATEFIRST, вы также можете очистить часть этой логики).

Но я большой поклонник создания самодокументируемого кода вместо краткого / загадочного.

0 голосов
/ 07 февраля 2019

Вы действительно близки, вам просто нужно изменить второй ноль на дни, которые вы хотите переместить.

WHERE startdatetime >= dateadd(hour,21,dateadd(dd,datediff(dd,0,getdate()),-9))
AND startdatetime <= dateadd(hour,23,dateadd(dd,datediff(dd,0,getdate()),-3))

Ошибка 207 относится к неверному имени столбца.Убедитесь, что в вашем запросе нет опечаток и столбцы действительно существуют.

...