如何将VARCHAR日期转换为DateTime2日期



我将表上传到SQL Server中,每列作为varchar(max)nvarchar(max)数据类型。我之所以这样做的原因是因为我是从具有数百万记录的.CSV文件上传的,我不想花几个小时在将数据输入SQL Server之前清理数据。

但是,我现在在Log_Date列中具有所有类型的字符。我能够识别我想要的两个格式的log_dates。

两个日志日期格式是

  1. MM/DD/YYYY MM:SS(或 M / d /yyyy m :ss(或
  2. 处于适当的DateTime格式

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

如何将MM/DD/YYYY MM:SSvarchar Log_Date(或 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

格式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

最新更新