到目前为止,有很多好的建议,所以我将采取稍微不同的课程。
假设您可以访问数字表。如果没有,那就去买一个吧!:) 让我们也假设它以Numberscolumn命名Number。
另外,让我们使用CTE来提高可读性。这是一个非常简洁的查询。
; WITH ValidYears AS
(
SELECT Number AS ValidYear
FROM [dbo].[Numbers]
WHERE Number >= 2013
AND Number >= YEAR(GETDATE()) - 1
AND NUmber <= YEAR(GETDATE())
)
SELECT *
FROM [DBName].[dbo].[TABLE_NAME] a
JOIN ValidYears b
ON a.YR_CLMN = b.ValidYear
我喜欢的是你将查询分成逻辑单元。CTE 处理年份逻辑,下面的查询决定如何处理它。
当然,您不必使用数字表。我只是觉得它看起来更好。
这是我的本地数字表的示例,以及 CTE 结果的样子。如果您的索引正确,将会有一个聚集索引搜索 - 非常有效。(旁注:我的表名为“整数”)
DECLARE @CurrentYear INT
SET @CurrentYear = 2016
SELECT value AS ValidYear
FROM [dbo].Integers
WHERE value >= 2013
AND value >= @CurrentYear - 1
AND value <= @CurrentYear