2016-04-06 23 views
1

2016年以降は表示されないアプリがあります。今後の表示年

同時に、時間が経つにつれて、過去の年を表示する必要があります。例えば

:年2017年

  • 、私は2018年には2016年と2017年
  • を表示する必要がありますが、私は2016年、2017年を表示する必要があるだろう、と2018年
  • などです。

私はこれを達成するために次のコードを開発しました。

あなたはこれをTSQLで実現するためのよりよい方法を知っていますか?

SELECT [Year] FROM (
SELECT YEAR(GETDATE()) AS 'Year' 
UNION 
SELECT YEAR(DATEADD(year,-1,GETDATE())) AS 'Year' WHERE YEAR(GETDATE()) > 2017 
UNION 
SELECT YEAR(DATEADD(year,-2,GETDATE())) AS 'Year' WHERE YEAR(GETDATE()) > 2018 
UNION 
SELECT YEAR(DATEADD(year,-3,GETDATE())) AS 'Year' WHERE YEAR(GETDATE()) > 2019 
UNION 
SELECT YEAR(DATEADD(year,-4,GETDATE())) AS 'Year' WHERE YEAR(GETDATE()) > 2020 
UNION 
SELECT YEAR(DATEADD(year,-5,GETDATE())) AS 'Year' WHERE YEAR(GETDATE()) > 2021 
UNION 
SELECT YEAR(DATEADD(year,-6,GETDATE())) AS 'Year' WHERE YEAR(GETDATE()) > 2022 
UNION 
SELECT YEAR(DATEADD(year,-7,GETDATE())) AS 'Year' WHERE YEAR(GETDATE()) > 2023 
) x 
ORDER BY [Year] DESC 
+0

なぜTSQLでこれを行うのですか?なぜアプリケーションのコードではないのですか? –

答えて

3

はい、カレンダーのテーブルと、それは簡単です、これは2016年から現在の年に

WITH CTE_TEST AS(
    SELECT 2016 AS NYEAR 
    UNION ALL 
    SELECT NYEAR+1 
    FROM CTE_TEST 
    WHERE NYEAR+1 <= YEAR(GETDATE()) 
) 
SELECT * FROM CTE_TEST 
1

アプリケーションで処理するすべての有効年を含む年表を作成します。

Select Year From Year 
Where Year>=2016 
AND Year<=DATEPART(Year,GETDATE()) 
+0

5年後の誰かが_ "WTFにはこのテーブルが必要ですか?"と言うことになるので、その目的を明記してください。_ – MikeTheLiar

+0

面白いことに、このようなテーブルはかなり便利です。数値シリーズのギャップを見つけようとしたことがありますか?かなり便利な数のテーブルを作成します。またはCTE。 – UnhandledExcepSean

+0

年表の代わりに、私は年のすべての日付を含む完全なカレンダー表を、より長い期間、たとえば20-50年使用します。それは自明であり、頻繁に使用することができます。それはあなたの人生をはるかに簡単にし、より効率的なより簡単でメンテナンス可能なSQLを書くことを可能にします。 30年を含むすべての日付は136kbのHD空間しか必要としません。 –

1

の年のリストを生成し、これを試してみてください:

SELECT [Year] = YEAR(c.Date) 
FROM CalendarTable c 
WHERE YEAR(c.Date) >= 2016 AND YEAR(c.Date) <= YEAR(GETDATE()) 
GROUP BY YEAR(c.Date) 
ORDER BY YEAR(c.Date) 

How to generate a calendar table(探し"カレンダーテーブル")。

1

あなたはこのように、インラインの数値テーブルを作成し、消費することができます上記のクエリで使用される

-- Return all years starting from current year up to @YEAR 
DECLARE @YEAR INT = 2011 

SELECT y AS 'YEAR' 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 
    FROM (VALUES (0), (0), (0), (0), (0)) AS t1(n) 
    CROSS JOIN (VALUES (0), (0), (0), (0), (0)) AS t2(n)) AS x(i)  
CROSS APPLY (SELECT YEAR(DATEADD(year,-1*x.i,GETDATE()))) AS t(y) 
WHERE y >= @YEAR 

のインライン表では、5×5 = 25個の行が含まれています。実際のニーズに合わせて調整することができます。

関連する問題