首先,发生了什么!第一次阅读,第一次海报。现在手续已经结束,直到细节。
我将数据从我们的核心系统(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来获取信息,并且不确定如何在导入数据之前转换日期。只是把它扔在那里,以防有人问我为什么不这样做。
查看 CASE 的文档。
CASE (Transact-SQL)
返回 中类型集中的最高优先级类型 result_expressions和可选else_result_expression。
这意味着 case 语句为整个查询返回一种数据类型,并且该数据类型由数据类型优先级 (Transact-SQL) 决定。CASE 的第一个分支返回一个date
因此整个 CASE 将返回一个date
。
你可以尝试这样的事情:
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