【问题标题】:Unable to convert from Julian INT date to regular TSQL Datetime无法从 Julian INT 日期转换为常规 TSQL 日期时间
【发布时间】:2010-06-17 03:55:22
【问题描述】:

帮助我 Stackoverflow,我即将在我的键盘上解决这个问题。我已经仔细研究过,但显然我没有做对。

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

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

所以我无法设置日期时间标准来运行存储过程的报告。

原值:733416 等效日历值:01-09-2009

下面是我的代码...我已经很接近了,但我看不出有什么问题,我需要我的 convert 语句将 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

【问题讨论】:

  • 很确定我的回答解决了您的问题。如果确实如此,请将其标记为已接受的答案,否则请告诉我我的答案没有多大帮助。

标签: tsql julian-date


【解决方案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'))”。任何小于此的数字都会导致日期下溢。

【讨论】:

  • 没问题,我添加了一个 date_applied 比较器,以防 date_applied 小于一个会导致日期下溢的数字,但这对于您的数据集可能不是问题。祝你好运。
  • 感谢您的帮助。我已经弄清楚了将整个转换为 datetime 而不是 char,但最短日期让我望而却步。今晚你真的救了我的培根!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 2013-05-11
  • 2018-01-17
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多