Обновить
Следуя вашим комментариям, я создал некоторые образцы данных, чтобы проверить свой ответ:
Создайте и заполните образцы данных (Пожалуйста, сохраните этот шаг в ваших будущих вопросах)
DECLARE @T as TABLE
(
Id int,
ActualDate Date,
LF_Date int
)
INSERT INTO @T (Id, ActualDate) VALUES
(10, DATEADD(DAY, -5, GETDATE())),
(9, DATEADD(DAY, -10, GETDATE())),
(8, DATEADD(DAY, -15, GETDATE())),
(7, DATEADD(DAY, -20, GETDATE())),
(6, DATEADD(DAY, -25, GETDATE())),
(5, DATEADD(DAY, -30, GETDATE())),
(4, DATEADD(DAY, -35, GETDATE())),
(3, DATEADD(DAY, -40, GETDATE())),
(2, DATEADD(DAY, -45, GETDATE())),
(1, DATEADD(DAY, -50, GETDATE()))
UPDATE @T
SET LF_Date = YEAR(ActualDate) * 10000 + MONTH(ActualDate) * 100 + DAY(ActualDate)
Данные тестового образца:
SELECT *
FROM @T
Полученные результаты:
Id ActualDate LF_Date
----------- ---------- -----------
10 2016-08-09 20160809
9 2016-08-04 20160804
8 2016-07-30 20160730
7 2016-07-25 20160725
6 2016-07-20 20160720
5 2016-07-15 20160715
4 2016-07-10 20160710
3 2016-07-05 20160705
2 2016-06-30 20160630
1 2016-06-25 20160625
Как вы можете видеть, столбец LF_Date
в образце таблицы представляет собой столбец int
, который сохраняет дату как yyyyMMdd
, как и в вопросе.
Запрос:
DECLARE @DateAsInt int,
@Date date = GETDATE();
SELECT @DateAsInt = YEAR(@Date) * 10000 + MONTH(@Date) * 100 + DAY(@Date);
SELECT *
FROM @T
WHERE LF_DATE >= @DateAsInt - 28
AND LF_DATE <= @DateAsInt
Полученные результаты:
Id ActualDate LF_Date
----------- ---------- -----------
10 2016-08-09 20160809
9 2016-08-04 20160804
Вывод:
что касается выборочных данных, ответ в порядке. Вам нужно проверить свои данные, чтобы увидеть, что мешает вам получить результаты за предыдущий месяц, но я серьезно сомневаюсь, что это мое предложение.
Первая версия
Предполагая, что версия вашего сервера Sql 2012 или более поздняя, вы можете использовать некоторые математические вычисления и DATEFROMPARTS
встроенная функция:
DECLARE @IntDate int = 20160322
SELECT DATEFROMPARTS (
(@IntDate - (@IntDate % 10000)) / 10000,
(@IntDate % 1000) / 100,
@IntDate % 100
) As [Date]
Полученные результаты:
Date
2016-03-22
Однако преобразование date
в int
будет проще и, вероятно, будет иметь лучшую производительность:
DECLARE @Date date = '2016-03-22'
SELECT YEAR(@Date) * 10000 +
MONTH(@Date) * 100 +
DAY(@Date) As [Int]
Полученные результаты:
Int
20160322
Чтобы поставить это в контексте вашего вопроса, вычислите значение int текущей даты перед вашим запросом:
DECLARE @DateAsInt int,
@Date date = GETDATE();
SELECT @DateAsInt = YEAR(@Date) * 10000 + MONTH(@Date) * 100 + DAY(@Date);
И затем в вашем предложении where вы просто пишете это:
...
AND LF_DATE >= @DateAsInt - 28
AND LF_DATE <= @DateAsInt
...
В любом случае вам будет лучше, если вы сможете изменить структуру таблицы и заменить этот столбец int столбцом даты. Прочтите плохие привычки Аарона Бертрана, чтобы kick : выбор неправильного типа данных.
person
Zohar Peled
schedule
10.08.2016
LF_DATE
? - person Hamlet Hakobyan   schedule 10.08.2016GETDATE
вы можете попробовать использовать функциюDATEADD
, чтобы получить диапазон дат. - person dub stylee   schedule 10.08.2016