2015-08-28 2 views
0

У меня есть столбец дат, который варьируется от 2015-06 до 2013-04. Диапазон дат будет увеличиваться по мере ввода большего количества данных. Как написать запрос, когда дата всегда равна Х за несколько месяцев до текущей даты?SQL создать список дат на основе текущей даты

date 
2015-06 
2015-05 
2015-04 
2015-03 
2015-02 

, например, я хочу, чтобы это было:

Select * 
From dbo.name 
Where date in (X months ago from current date) 

если дата сегодняшней является 2015-12, и я хочу, 3 месяца назад, я хочу запрос быть:

Select * 
From dbo.name 
Where date in ('2015-11','2015-10','2015-09') 

Спасибо

+1

NO вы не хотите этого делать вообще. Вы хотите использовать DATEADD. Где дата> DATEADD (MONTH, -3, GETDATE()) –

+0

@SeanLange будет работать только в том случае, если столбец даты имеет тип даты или даты и времени, и, глядя на данные, это не похоже на то, что – Sagar

+0

@SeanLange это будет игнорировать любые даты, указанные до сегодняшней даты. –

ответ

1
Select * 
From dbo.name 
Where CAST([Date] + '-01' AS DATE) >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -3, 0) 
+0

Я не думаю, что это сработает, если данные пользователя являются лишь частичной строкой даты, как показывает его пример данных. –

+0

@TabAlleman благодарит вас за указание на то, что я обновил свой ответ, чтобы обработать его :) –

0

С вашей строки даты в yyyy-mm формат вы можете сделать сравнение строк, используя <> =. Вам просто нужно, чтобы преобразовать текущую дату VARCHAR (7), используя стиль 126 (гггг-мм-DDThh: ми: СС.ммм)

Для примера

DECLARE @CurrentDate DATETIME = GETDATE() 
DECLARE @XMonthsAgo INT = 3 

DECLARE @Dates TABLE ([date] varchar(7)) 

INSERT INTO @Dates VALUES 
('2015-09'),('2015-08'),('2015-07'),('2015-06'),('2015-05'),('2015-04'),('2015-03'), 
('2015-02'),('2015-01'),('2014-12'),('2014-11'),('2014-10'),('2014-09'),('2014-08'), 
('2014-07'),('2014-06'),('2014-05'),('2014-04'),('2014-03'),('2014-02'),('2014-01') 

SELECT * 
FROM @Dates d 
WHERE [date] >= CONVERT(VARCHAR(7), DATEADD(month, [email protected], @CurrentDate), 126) 
     AND [date] < CONVERT(VARCHAR(7), @CurrentDate, 126) 

Результат

date 
---- 
2015-07 
2015-06 
2015-05 
Смежные вопросы