2010-06-17 2 views
1

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

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

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

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

Оригинал Значение: 733416 Эквивалент Календарь Значение: 01.09.2009

Ниже мой код ... Я так близко, но я не могу достаточно посмотреть, что случилось, мне нужно мое новообращенного заявление фактически преобразуем значение Julian (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 
+0

Довольно уверен, что мой ответ устраняет вашу проблему. Если это так, пожалуйста, отметьте это как принятый ответ, иначе, пожалуйста, дайте мне знать, как мой ответ не совсем помогает. –

ответ

1
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 

Вы кастинг на символ, но хочу DateTime, так что это один легко исправить.

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

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

+0

Благодарим вас, спасибо, спасибо ... – bluehiro

+0

Нет проблем, я добавил date_applied comprarer в случае, когда date_applied все равно меньше числа, которое приведет к переполнению даты, но это, вероятно, не проблема для вашего набора данных. Удачи. –

+0

Спасибо за помощь. Я выяснил, что все кастинг в datetime вместо char, но минимальная дата удерживала меня. Ты действительно спас мою бекон сегодня! – bluehiro

Смежные вопросы