如何制定简单的tsql年查询?

时间:2011-06-27 14:46:21

标签: tsql

我想编写一个t-sql查询,它只列出从2005年到现在的所有年份。但我希望这个自动化,所以这个清单仍然是明年的最新。我知道我可以用联盟来编写多年的代码。但是我如何开发一个自动化的t-sql查询呢?

4 个答案:

答案 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

在具有表类型返回的函数中封装它,您应该能够在将来的查询中加入该函数。