Невозможно преобразовать дату в Julian INT в обычный TSQL Datetime - PullRequest
1 голос
/ 17 июня 2010

Помогите мне, Stackoverflow, я близок к тому, чтобы решить эту проблему с помощью «HULK SMASH» на моей клавиатуре. Я тщательно исследовал, но, очевидно, что-то не так.

Я работаю с юлианскими датами, на которые ссылаются из проприетарного инструмента (Platinum SQL?), Хотя я работаю в SQL 2005. Я могу преобразовать их «специальную» версию Джулиана в datetime, когда я запускаю оператор выбора. К сожалению, он не будет вставлен в столбец datetime, при попытке получить следующую ошибку:

Преобразование типа данных char в тип данных datetime привело к значению datetime вне диапазона.

Поэтому я не могу установить критерии даты и времени для запуска отчета из хранимой процедуры.

Исходное значение: 733416 Значение календарного эквивалента: 01-09-2009

Ниже приведен мой код ... Я так близко, но я не совсем понимаю, в чем дело, мне нужно, чтобы мой оператор convert фактически преобразовал юлианское значение (733416) в совместимое значение TSQL DATETIME.

SELECT       
org_id, 
CASE WHEN date_applied = 0 THEN '00-00-00' 
ELSE convert(char(50),dateadd(day,date_applied-729960,convert(datetime, '07-25-99')),101) 
END AS date_applied,

CASE WHEN date_posted = 0 THEN '00-00-00'  
ELSE convert(char(50),dateadd(day,date_posted-729960,convert(datetime, '07-25-99')),101) 
END AS date_posted

from general_vw

1 Ответ

1 голос
/ 17 июня 2010
SELECT       
org_id, 
CASE WHEN date_applied = 0 OR date_applied < 639906 THEN convert(datetime, '1753-01-01')
ELSE dateadd(day,date_applied-729960,convert(datetime, '07-25-99'))
END AS date_applied,

CASE WHEN date_posted = 0 OR date_applied < 639906 THEN convert(datetime, '1753-01-01')
ELSE dateadd(day,date_posted-729960,convert(datetime, '07-25-99'))
END AS date_posted

from general_vw

Вы преобразуетесь в char, но хотите использовать дату и время, так что это одно простое исправление.

Вы также использовали '00 -00-00 'в качестве минимальной даты, но минимальная дата TSQL равна'1753-01-01'.В качестве альтернативы вы можете использовать что-то вроде ('1900-01-01'), но для этого потребуется изменить компаратор date_applied "меньше чем".

Я также добавил компаратор date_applied "меньше чем".Я рассчитал это как «SELECT 729960 + datediff (день, преобразование (datetime, '07 -25-99 '), преобразование (datetime,' 1753-01-01 '))».Любое число меньше этого приведет к потере даты.

...