У меня есть таблица с новостями
News
-------
NewsId
NewsText
CREATED_DATE
Мне нужно получать новости, начиная с указанной даты до неизвестной даты, но результат должен содержать новости за 5 дней.
Например:
- если у меня есть новости, связанные с этими датами: 29, 28, 27, 5, 4, 3-го и с датой начала, указанной 29, мне нужно получить новости, где дата создания между 29 и 4.
Я не знаю, как получить низкую дату (4-е) в этом случае без грубой силы:
declare @highDate date = '2011-09-20';
declare @rows int = 0;
declare @lowDate date = @highDate;
declare @i int = 0;
--Querying while rows count != 5
WHILE (@rows != 5)
BEGIN
if (@i = 60)
break;
set @i = @i + 1;
set @lowDate = (select DATEADD(day, -1, @lowDate));
set @rows = (select COUNT(*) from
(SELECT DAY(CAST(CREATED_DATE AS date)) as c1
FROM .[dbo].[NEWS]
and CREATED_DATE > @lowDate
and CREATED_DATE < @highDate
group by DAY(CAST(CREATED_DATE AS date))) as rowsCount);
END
--then return news between to known dates
SELECT *
FROM [dbo].[NEWS]
and CREATED_DATE > @lowDate
and CREATED_DATE < @highDate
order by CREATED_DATE desc
Я думаю, в этом алгоритме слишком много запросовпротив БД, и я бы хотел избавиться от 60-дневного ограничения