Я бы предпочел следующее решение, так как оно 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)