Как сформулировать простой запрос ЦКЛ год? - PullRequest
1 голос
/ 27 июня 2011

Я хочу написать запрос t-sql, который просто перечислит все годы с 2005 по настоящее время. Но я хочу, чтобы это было автоматизировано, так что этот список будет актуален в следующем году. Я знаю, я мог бы просто жестко программировать годы с союзом. Но как мне разработать t-sql-запрос, который автоматизирует это?

Ответы [ 4 ]

4 голосов
/ 27 июня 2011

Я бы порекомендовал подход таблицы подсчета - в основном просто создайте таблицу (называемую «Счет» / «Числа», как вы хотите) с одним столбцом и заполните, например, например. от 0 до 1000 и поместите в столбец индекс CLUSTERED.

Затем вы можете использовать его как:

SELECT 2005 + Num AS Yr
FROM Tally
WHERE Num <= YEAR(GETDATE()) - 2005

Таблицы подсчета могут быть очень полезны для всех видов использования, поэтому я предлагаю использовать один из них, поскольку он может помочь в других сценариях.

Множество статей по подсчетным таблицам, вот только одна:
http://www.sqlservercentral.com/articles/T-SQL/62867/

2 голосов
/ 27 июня 2011

Я бы попробовал вот так

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
2 голосов
/ 27 июня 2011

Вы можете сделать это, используя Common Table Expressions (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
1 голос
/ 27 июня 2011

грубый, но эффективный простой метод

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

Инкапсулируйте это в функцию с табличным типом return, и вы должны иметь возможность присоединиться к ней в будущих запросах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...