1

我正在使用 T-SQL,我试图让 then 语句返回多个值,以便我可以搜索“年份”列多年。

如果年份大于 2013,那么我想搜索当前年份和上一年。因此,如果年份是 2016,我想搜索 2016 AND 2015。

这段代码不起作用,但这是我想要完成的。

SELECT *
FROM [DB_NAME].[dbo].[TABLE_NAME] 
WHERE 
YR_CLMN in 
(
case when YEAR(GETDATE()) = 2013 then YEAR(GETDATE()) 
when YEAR(GETDATE()) > 2013 then (YEAR(GETDATE()), YEAR(GETDATE())-1)
end
)

提前致谢!!!

4

4 回答 4

3

我不是 100% 确定我理解这个问题,但我相信它会给你你想要的

SELECT *
FROM [DB_NAME].[dbo].[TABLE_NAME] 
WHERE 
YR_CLMN >= 
(
case when YEAR(GETDATE()) > 2013 then YEAR(GETDATE())-1) 
ELSE YEAR(GETDATE())
end
) AND YR_CLMN <= YEAR(GETDATE())

这是

SQLFiddle

于 2013-04-23T14:59:02.657 回答
1

尝试:

SELECT * FROM [DB_NAME].[dbo].[TABLE_NAME] 
WHERE YR_CLMN in 
(YEAR(GETDATE()), 
 case when YEAR(GETDATE()) > 2013 then YEAR(GETDATE())-1 else YEAR(GETDATE()) end)
于 2013-04-23T15:06:16.190 回答
0
DECLARE @Dates Table
(
  YR_CLMN DateTime
  BringOut bit DEFAULT ( 0 )
)

--Get all columns
INSERT INTO @Dates ( YR_CLMN )
SELECT YR_CLMN
FROM [dbo].[YourTable]

--Where YR_CLMN = 2013
UPDATE @Dates SET BringOut = 1
WHERE YEAR(YR_CLMN) = 2013

--Where YR_CLMN is within a year of now
UPDATE @Dates SET BringOut = 1
WHERE YEAR(YR_CLMN) = YEAR(GETDATE()) OR YEAR(YR_CLMN) = YEAR(GETDATE()) - 1

SELECT YR_CLMN
FROM @Dates
WHERE BringOut = 1

或者,如果上述方法不可接受。您本质上是在说 if YR_CLMN = 2013 OR (YR_CLMN = YEAR(GETDATE()) AND YR_CLMN = YEAR(GETDATE()) - 1), usingIN在性能方面确实不是很有成效。

于 2013-04-23T14:58:54.780 回答
0

到目前为止,有很多好的建议,所以我将采取稍微不同的课程。

假设您可以访问数字表。如果没有,那就去买一个吧!:) 让我们也假设它以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
于 2013-04-23T15:56:22.243 回答