さまざまな文字列、日付、および数値形式に切り替えるよりも、ネイティブの日時計算を使用する方が効率的だと思います。
DECLARE @julian VARCHAR(6) = '111186';
SELECT DATEADD(YEAR,
100*CONVERT(INT, LEFT(@julian,1))
+10*CONVERT(INT, SUBSTRING(@julian, 2,1))
+CONVERT(INT, SUBSTRING(@julian,3,1)),
DATEADD(DAY, CONVERT(INT,SUBSTRING(@julian, 4, 3))-1,
0));
結果:
===================
2011-07-05 00:00:00
このデータが頻繁に変更されないと仮定すると、実際には日付を計算列として格納する方がはるかに効率的かもしれません (これが、0
のベース日付を選択した理由です) 文字列表現の代わりに、決定論の問題を引き起こし、列が永続化され、場合によってはインデックスが作成されなくなります)。
CREATE TABLE dbo.JDEDates
(
JDEDate VARCHAR(6),
GregorianDate AS CONVERT(SMALLDATETIME,
DATEADD(YEAR,
100*CONVERT(INT, LEFT(RIGHT('0'+JDEDate,6),1))
+10*CONVERT(INT, SUBSTRING(RIGHT('0'+JDEDate,6), 2,1))
+CONVERT(INT, SUBSTRING(RIGHT('0'+JDEDate,6),3,1)),
DATEADD(DAY, CONVERT(INT, RIGHT(JDEDate, 3))-1,
0))
) PERSISTED
);
INSERT dbo.JDEDates(JDEDate) SELECT '111186';
SELECT JDEDate, GregorianDate FROM dbo.JDEDates;
結果:
JDEDate GregorianDate
======= ===================
111186 2011-07-05 00:00:00
列にインデックスを付けない場合でも、醜い計算は隠されます。その列が参照されるたびに、クエリ時に高価な関数操作を実行する必要がないため、書き込み時にのみ支払う必要があります。 ...