Saya pikir lebih efisien menggunakan matematika datetime asli daripada semua ini beralih bolak-balik ke berbagai format string, tanggal, dan numerik.
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));
Hasil:
===================
2011-07-05 00:00:00
Dengan asumsi data ini tidak sering berubah, mungkin jauh lebih efisien untuk benar-benar menyimpan tanggal sebagai kolom yang dihitung (itulah sebabnya saya memilih tanggal dasar 0
alih-alih beberapa representasi string, yang akan menyebabkan masalah determinisme yang mencegah kolom bertahan dan berpotensi diindeks).
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;
Hasil:
JDEDate GregorianDate
======= ===================
111186 2011-07-05 00:00:00
Bahkan jika Anda tidak mengindeks kolom, itu masih menyembunyikan perhitungan jelek dari Anda, karena Anda hanya membayarnya pada waktu penulisan, karena itu tidak menyebabkan Anda melakukan operasi fungsional yang mahal pada waktu kueri setiap kali kolom itu direferensikan ...