Ik denk dat het efficiënter is om native datetime-wiskunde te gebruiken dan al dat heen en weer schakelen naar verschillende tekenreeksen, datums en numerieke formaten.
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));
Resultaat:
===================
2011-07-05 00:00:00
Ervan uitgaande dat deze gegevens niet vaak veranderen, kan het veel efficiënter zijn om de datum daadwerkelijk op te slaan als een berekende kolom (daarom heb ik de basisdatum van 0
gekozen in plaats van een tekenreeksrepresentatie, die determinismeproblemen zou veroorzaken, waardoor de kolom niet kan worden behouden en mogelijk kan worden geïndexeerd).
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;
Resultaten:
JDEDate GregorianDate
======= ===================
111186 2011-07-05 00:00:00
Zelfs als u de kolom niet indexeert, verbergt het nog steeds de lelijke berekening voor u, omdat u volhardt, betaalt u dat alleen tijdens het schrijven, omdat het er niet voor zorgt dat u tijdens het opvragen dure functionele bewerkingen uitvoert wanneer naar die kolom wordt verwezen ...