首先,最新消息!第一次读者,第一次海报。现在,形式已经不在了,直到细节。
我将数据从我们的核心系统(as400)复制到SQL数据库,因此我们可以运行自己的事务报告。我镜像了字段类型以避免任何导入问题,因此日期字段是小数。日期如下:MDDYY 1月 - 9月MMDDYY 10月 - 12月。到目前为止我可以将其转换为日期时间。
select
wtdate [og_date]
,len (wtdate) [length]
,case when
len(cast(replace(wtdate,' ','') as char)) = 5
then
CONVERT(DATe,LEFT((CONVERT(VARCHAR,'0') + CONVERT(VARCHAR, WTDATE)),2)+'/'+SUBSTRING((CONVERT(VARCHAR,'0') + CONVERT(VARCHAR, WTDATE)),3,2)+'/'+ '20' + RIGHT((CONVERT(VARCHAR,'0') + CONVERT(VARCHAR, WTDATE)),2),110)
when
len(cast(replace(wtdate,' ','') as char)) = 6
then
LEFT(WTDATE,2)+'/'+SUBSTRING(CAST(WTDATE AS VARCHAR),3,2)+'/'+ '20' + RIGHT(WTDATE,2)
--cast(wtdate as varchar)
else
'Error converting date'
end as [convert datetime]
from
Trans
group by wtdate
order by wtdate
results
og_date length convert datetime
92514 5 2014-09-25
92614 5 2014-09-26
92914 5 2014-09-29
93014 5 2014-09-30
100114 6 2014-10-01
100214 6 2014-10-02
100314 6 2014-10-03
100614 6 2014-10-06
100714 6 2014-10-07
我遇到的问题:当我只转换长度为5个字符的那个时,为什么整个列都被转换为日期。当长度等于6时,似乎完全忽略了这种情况。任何帮助都将受到赞赏。 谢谢。
此外,我使用openquery获取信息,并且在导入数据之前不确定如何转换日期。只是把它扔出去,万一有人问我为什么不这样做。
答案 0 :(得分:3)
查看CASE的文档。
从中输入类型集中的最高优先级类型 result_expressions和可选的else_result_expression。
这意味着case语句为整个查询返回一种数据类型,该数据类型由Data Type Precedence (Transact-SQL)决定。 CASE的第一个分支返回date
,因此整个CASE将返回date
。
答案 1 :(得分:1)
您可以尝试这样的事情:
select wtdate, CONVERT(DATE,
'20'+RIGHT(wtdate,2)
+REVERSE(LEFT(SUBSTRING(REVERSE(wtdate),5,2)+'0',2))
+LEFT(RIGHT(wtdate,4),2)
) AS ConvertedDate
from Trans
group by wtdate
order by wtdate