2010-06-17 40 views
1

帮助我Stackoverflow,我正在接近在我的键盘上关于此问题的所有“HULK SMASH”。我仔细研究过,但我显然没有得到正确的结果。无法从Julian INT日期转换为常规TSQL日期时间

我正在使用专有工具(Platinum SQL?)引用的Julian日期,尽管我在SQL 2005中工作。在运行select语句时,我可以将Julian的“特殊”版本转换为datetime。不幸的是,它不会插入到日期时间列中,当我尝试时出现以下错误:

将char数据类型转换为日期时间数据类型导致超出范围的日期时间值。

所以我不能设置日期时间标准来运行关于存储过程的报告。

原价: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

很确定我的答案解决了您的问题。如果确实如此,请将其标记为已接受的答案,否则请让我知道我的答案如何帮助不大。 – 2010-06-17 04:03:31

回答

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 

你铸造成char,但希望有一个日期时间所以这是一个简单的解决方法。

您还使用'00 -00-00'作为最低日期,但最小TSQL日期为'1753-01-01'。或者,您可以使用类似('1900-01-01')的东西,但需要更改“少于”date_applied比较器。

我添加了“少于”date_applied比较器。我把它计算为“SELECT 729960 + datediff(day,convert(datetime,'07 -25-99'),convert(datetime,'1753-01-01'))”。任何小于此值的数字都会导致日期下溢。

+0

谢谢谢谢谢谢谢谢... – bluehiro 2010-06-17 04:05:26

+0

没问题,我添加了一个date_applied comprarer,以防date_applied小于一个会导致日期下溢的数字,但这对您的数据集可能不是问题。祝你好运。 – 2010-06-17 04:10:46

+0

感谢您的帮助。我已经计算出了整个演员的日期时间,而不是char,但最低日期让我失望。你今晚真的保存了我的培根! – bluehiro 2010-06-17 04:17:40