Myslím, že je efektivnější používat nativní matematiku data a času, než celé to přepínání tam a zpět na různé formáty řetězců, data a čísel.
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));
Výsledek:
===================
2011-07-05 00:00:00
Za předpokladu, že se tato data často nemění, může být mnohem efektivnější uložit datum jako vypočítaný sloupec (proto jsem zvolil základní datum 0
místo nějaké řetězcové reprezentace, která by způsobila problémy s determinismem bránící tomu, aby byl sloupec zachován a potenciálně indexován).
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;
Výsledky:
JDEDate GregorianDate
======= ===================
111186 2011-07-05 00:00:00
I když sloupec neindexujete, stále před vámi skrývá ošklivý výpočet, protože při zachování platíte pouze v době zápisu, protože to nezpůsobuje provádění drahých funkčních operací v době dotazu, kdykoli je na sloupec odkazováno. ...