SQL выборка данных за текущий год до пятницы на предыдущей неделе - PullRequest
0 голосов
/ 20 марта 2019

Пытаюсь получить данные в SQL до пятницы за предыдущую неделю текущего года из поля datetime fetchDate

Я пытался что-то подобное, но это не досегодня

(year(fetchDate) = year(GETDATE()) and month(fetchDate) <= month(GETDATE()) and day(fetchDate) <= day(GETDATE()))

, тогда как

(year(fetchDate) = year(GETDATE()) and month(fetchDate) <= month(GETDATE()) and day(fetchDate) <= day(DATEADD(wk,DATEDIFF(wk,7,GETDATE()),4)))

приносит мне данные только за текущий месяц года до последней недели.

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Я бы предпочел следующее решение, так как оно sargable .Внутри предиката WHERE мы не заключаем дату выборки в функцию (например, YEAR(Fetchdate)), оптимизатор запросов может использовать существующие индексы и не должен сканировать всю таблицу.Особенно для рабочих нагрузок BI, где этот запрос является распространенным, чрезвычайно важно оптимизировать его, так как запрашивается множество записей.Это происходит за счет чуть меньше читаемость

declare @tab table
(
    fetchdate datetime
)
insert into @tab
values ('2019-01-01'),('2019-03-15'),('2018-12-31'),('2019-03-16')
SELECT 
*,
case when datepart(weekday, getdate()) >5 then
 DATEADD(DAY, +4, DATEADD(WEEK, DATEDIFF(WEEK, 0, getdate()), 0)) 
else DATEADD(DAY, -3, DATEADD(WEEK, DATEDIFF(WEEK, 0, getdate()), 0)) end as TestLastFriday,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) as TestFirstDayOfYear
FROM @tab
where 
    fetchdate <= case when datepart(weekday, getdate()) >5 then DATEADD(DAY, +4, DATEADD(WEEK, DATEDIFF(WEEK, 0, getdate()), 0)) 
                 else DATEADD(DAY, -3, DATEADD(WEEK, DATEDIFF(WEEK, 0, getdate()), 0)) end and 
    fetchdate >= DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)
1 голос
/ 20 марта 2019

Я считаю, что вам нужно следующее:

WHERE YEAR(fetchDate) = YEAR(CURDATE()) 
AND fetchDate < DATE_SUB(NOW(), INTERVAL ((7 + WEEKDAY(DATE_SUB(NOW(), INTERVAL 1 WEEK)) - 4) % 7) DAY)

Мы получаем, сколько дней назад была пятница на прошлой неделе:

((7 + WEEKDAY(DATE_SUB(NOW(), INTERVAL 1 WEEK)) - 4) % 7)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...