我正在使用T-SQL,我试图让then语句返回多个值,这样我就可以在'Year'列中搜索多年。
如果年份大于2013年,那么我想搜索当前年份和上一年度。因此,如果今年是2016年,我想搜索2016年和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
)
提前致谢!!!
答案 0 :(得分:3)
我不是百分百肯定我理解这个问题,但我相信它会给你你想要的东西
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())
这是
答案 1 :(得分: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)
答案 2 :(得分: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
或者,如果上述方法不可接受。你基本上是在说YR_CLMN = 2013 OR (YR_CLMN = YEAR(GETDATE()) AND YR_CLMN = YEAR(GETDATE()) - 1)
,IN
使用{{1}}在性能方面确实不是很有效率。
答案 3 :(得分:0)
到目前为止,有很多好的建议,所以我会采取稍微不同的做法。
假设您已获得numbers table的访问权限。如果没有,去买一个! :)我们还假设它名为Numbers
,列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结果的样子。如果您已正确编入索引,则会有一个聚簇索引搜索 - 非常有效。 (旁注:我的表名为&#34;整数&#34;)
DECLARE @CurrentYear INT
SET @CurrentYear = 2016
SELECT value AS ValidYear
FROM [dbo].Integers
WHERE value >= 2013
AND value >= @CurrentYear - 1
AND value <= @CurrentYear