#sql #sql-server #datetime
#sql #sql-server #дата и время
Вопрос:
Я пытаюсь извлечь данные в SQL до пятницы на предыдущей неделе за текущий год из поля datetime fetchDate-дата-время — 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)))
возвращает мне данные только за текущий месяц года до прошлой недели.
Комментарии:
1. вы пробовали поисковую систему с «sqlserver в прошлый понедельник» (или в любой другой день на самом деле). это даст вам представление о том, как вычислить прошлую пятницу. тогда ваш запрос должен быть таким: year — это тот же год и ДАТА <= {lastfridaydate}, для этого вам не нужно переходить к функциям month / day.
2. Некоторые примерные даты действительно помогли бы мне понять, что вы подразумеваете под «пятницей на предыдущей неделе».
Ответ №1:
Я полагаю, что вам нужно следующее:
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)
Ответ №2:
Я бы предпочел следующее решение, поскольку оно доступно. Внутри предиката WHERE мы не преобразуем fetchdate в функцию (например, 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)