SQL Server 2008データベースに日付ディメンションテーブルを設定することを検討しています。テーブルのフィールドは次のとおりです。
[DateId] INT IDENTITY(1,1) PRIMARY KEY
[DateTime] DATETIME
[Date] DATE
[DayOfWeek_Number] TINYINT
[DayOfWeek_Name] VARCHAR(9)
[DayOfWeek_ShortName] VARCHAR(3)
[Week_Number] TINYINT
[Fiscal_DayOfMonth] TINYINT
[Fiscal_Month_Number] TINYINT
[Fiscal_Month_Name] VARCHAR(12)
[Fiscal_Month_ShortName] VARCHAR(3)
[Fiscal_Quarter] TINYINT
[Fiscal_Year] INT
[Calendar_DayOfMonth] TINYINT
[Calendar_Month Number] TINYINT
[Calendar_Month_Name] VARCHAR(9)
[Calendar_Month_ShortName] VARCHAR(3)
[Calendar_Quarter] TINYINT
[Calendar_Year] INT
[IsLeapYear] BIT
[IsWeekDay] BIT
[IsWeekend] BIT
[IsWorkday] BIT
[IsHoliday] BIT
[HolidayName] VARCHAR(255)
2つのパラメーターの日付D1とD2の間のすべての日付を返す関数DateListInRange(D1、D2)を作成しました。
すなわち。パラメータ '2014-01-01'および '2014-01-03'は以下を返します。
2014-01-01
2014-01-02
2014-01-03
2010-01-01から2020-01-01の範囲内のすべての日付のDATE_DIMテーブルにデータを入力したい。ほとんどのフィールドには、SQL 2008のDATEPART、DATENAME、およびYEAR関数を入力できます。
会計データにはもう少し多くのロジックが含まれており、その一部は互いに依存しています。例:会計四半期1->会計月は1、2または3でなければなりません会計四半期2->会計月は4、5または6でなければなりません
特定の日付を受け入れ、すべての会計データまたはすべてのフィールドを出力するテーブル値関数を簡単に作成できます。次に、この関数は、DateListInRange関数の各行で実行する必要があります。
休日の表が変更された場合、これは年に数回入力するだけでよいので、速度にはあまり関心がありません。
これをSQLで書くための最良の方法は何ですか?
現在、このように:
SELECT
[Date],
CAST([Date] AS DATE) AS [Date],
DATEPART(W,[Date]) AS [DayOfWeek_Number], -- First day of week is sunday
DATENAME(W,[Date]) AS [DayOfWeek_Name],
SUBSTRING(DATENAME(DW,[Date]),1,3) AS [DayOfWeek_ShortName],
DATEPART(WK, [Date]) AS [WeekNumber],
DATEPART(M, [Date]) AS [Calendar_Month_Number],
DATENAME(M, [Date]) AS [Calendar_Month_Name],
SUBSTRING(DATENAME(M, [Date]),1,3) AS [Calendar_Month_ShortName],
DATEPART(QQ, [Date]) AS [Calendar_Quarter],
YEAR([Date]) AS [Calendar_Year],
CASE WHEN
(
(YEAR([Date]) % 4 = 0) AND (YEAR([Date]) % 100 != 0)
OR
(YEAR([Date]) % 400 = 0)
)
THEN 1 ELSE 0
END AS [IsLeapYear],
CASE WHEN
(
DATEPART(W,[Date]) = 1 OR DATEPART(W,[Date]) = 7
)
THEN 0 ELSE 1
END AS [IsWeekDay]
FROM [DateListForRange]
('2014-01-01','2014-01-31')
会計データについても同じことを行うと、各ケースのステートメントがかなり繰り返されるため、関数を使用するとステートメントを回避でき、日付のリストにTVFをクロス適用できます。
SQL Server 2008を使用しているため、新しい日付機能の多くは最小限に抑えられています。