Я думаю, что более эффективно использовать встроенную математику даты и времени, чем все это переключение назад и вперед к различным форматам строк, дат и чисел.
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
Даже если вы не индексируете столбец, он все равно скрывает от вас уродливые вычисления, будучиПостоянно вы платите только во время записи, так как это не заставляет вас выполнять дорогостоящие функциональные операции во время запроса, когда на этот столбец ссылаются ...