如何将varchar日期转换为datetime2日期

时间:2019-05-01 22:57:37

标签: sql sqldatatypes

我已将表的每一列都以varchar(max)nvarchar(max)数据类型上传到SQL Server。之所以这样做,是因为我从具有数百万条记录的.CSV文件上传,并且我不想花很多时间清理数据,然后再将其输入SQL Server。

但是,我现在在Log_Date列中拥有所有类型的字符。我能够确定我想要的两个格式化的log_dates。

两种日志日期格式为

  1. MM/DD/YYYY MM:SS(或 M / D / YYYY M :SS)或
  2. 采用适当的日期时间格式

我无法将Log_Date转换为datetime字符,因为其中还有其他阻止转换的数据类型(单词,符号,数字和符号等)。

如何转换varchar Log_Date中的MM/DD/YYYY MM:SS(或 M / D / YYYY M :SS )到datetime

这是我尝试过的方法,但是它不会转换记录。

select 
     id
    ,log_date
    ,case when log_date like '%[0-9]%/%[0-9]%/%[0-9]%' 
         then try_convert(datetime2,log_date,126) 
         else null 
     end as Potato
from 
    full_union
where 
    id not like '%[^0-9]%'
    and id = 4112541

请参见下面的摘要摘录

id      log_date                        Potato
-----------------------------------------------
4112541 2/13/2019 15:41                 NULL
4112541 2/13/2019 15:41                 NULL
4112541 2019-04-18 11:42:00.0000000     NULL
4112541 2019-04-18 11:45:00.0000000     NULL

1 个答案:

答案 0 :(得分:0)

格式126特别是ISO标准格式,日期和时间之间带有“ T”。

SQL Server在确定格式方面非常出色,因此这可能就足够了:

(case when log_date like '%[0-9]%-%[0-9]%-%[0-9]%' 
     then try_convert(datetime2, log_date) 
 end) as Potato

编辑:

由于格式中的/,您遇到了问题。但是即使修复了该问题,它也无法正常工作。连字符正在发生奇怪的事情。确实可行:

(case when log_date like '%[0-9]%_%[0-9]%_%[0-9]%' 
     then try_convert(datetime2,log_date) 
     else '2000-01-01' 
 end) as Potato