2015-08-28 127 views
0

我有一列日期範圍從2015-06到2013-04。日期範圍將隨着我輸入更多數據而增加。如何在日期始終爲當前日期前的X個月的情況下編寫查詢?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(月,-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(YYYY-MM-DDTHH:MI:ss.mmm)

對於實例

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