SQL - char MDDYY or MMDDYY `to datetime



首先,发生了什么!第一次阅读,第一次海报。现在手续已经结束,直到细节。

我将数据从我们的核心系统(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

最新更新