帮助我Stackoverflow,我已经接近在这个问题上键盘上的所有“HULK SMASH”了。我仔细研究过,但显然我没有做对。
我正在处理从专有工具(Platinum SQL?)引用的Julian日期,虽然我在SQL 2005中工作。当我运行select语句时,我可以将他们的“特殊”版本的Julian转换为datetime。不幸的是,它不会插入日期时间列,我尝试时会出现以下错误:
将char数据类型转换为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
你正在转向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'))”。任何小于此值的数字都会导致日期下溢。