SQL - char MDDYY或MMDDYY`到datetime

时间:2014-12-27 18:45:43

标签: sql sql-server tsql

首先,最新消息!第一次读者,第一次海报。现在,形式已经不在了,直到细节。

我将数据从我们的核心系统(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获取信息,并且在导入数据之前不确定如何转换日期。只是把它扔出去,万一有人问我为什么不这样做。

2 个答案:

答案 0 :(得分:3)

查看CASE的文档。

CASE (Transact-SQL)

  

从中输入类型集中的最高优先级类型   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