我想编写一个t-sql查询,它只列出从2005年到现在的所有年份。但我希望这个自动化,所以这个清单仍然是明年的最新。我知道我可以用联盟来编写多年的代码。但是我如何开发一个自动化的t-sql查询呢?
答案 0 :(得分:4)
我建议采用计数表方法 - 基本上只需用一列创建一个表(称为“Tally”/“Numbers”),并填充例如:数字0到1000并在列上放置CLUSTERED索引。
然后您可以像:
一样使用它SELECT 2005 + Num AS Yr
FROM Tally
WHERE Num <= YEAR(GETDATE()) - 2005
Tally表可以非常方便地用于各种用法,因此我建议使用一个,因为它可以帮助其他场景。
关于理货表的很多文章,这里只有一篇:
http://www.sqlservercentral.com/articles/T-SQL/62867/
答案 1 :(得分:2)
您可以使用公用表表达式(CTE)执行此操作,并且不需要您创建临时表:
DECLARE @TheYear as date
SET @TheYear = '1/1/2005'
;WITH DateIntervalsCTE AS
(
SELECT 0 i, @TheYear AS [Year]
UNION ALL
SELECT i + 1, DATEADD(year, i + 1, @TheYear )
FROM DateIntervalsCTE
WHERE YEAR(DATEADD(year, i, @TheYear )) <= YEAR(GETDATE())
)
SELECT [Year] FROM DateIntervalsCTE
答案 2 :(得分:2)
我会这样试试
WITH cte(YEAR)
AS (
SELECT 2005 YEAR
UNION ALL
SELECT CH.YEAR +1
FROM cte ch
WHERE YEAR <= YEAR(GETDATE())
)
SELECT * FROM CTE
结果
YEAR
----
2005
2006
2007
2008
2009
2010
2011
2012
答案 3 :(得分:1)
粗略但有效的简单方法
DECLARE @I INT
CREATE TABLE #years (TheYear datetime)
SET @I = 0
WHILE @I <= DATEDIFF(year, '1/1/2005', GETDATE())
BEGIN
INSERT INTO #years VALUES (DATEADD(year, @i, '1/1/2005'))
SET @I = @I + 1
END
SELECT YEAR(TheYear) FROM #years
DROP TABLE #years
在具有表类型返回的函数中封装它,您应该能够在将来的查询中加入该函数。