2015-08-28 131 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