我将表上传到SQL Server中,每列作为varchar(max)
或nvarchar(max)
数据类型。我之所以这样做的原因是因为我是从具有数百万记录的.CSV
文件上传的,我不想花几个小时在将数据输入SQL Server之前清理数据。
但是,我现在在Log_Date
列中具有所有类型的字符。我能够识别我想要的两个格式的log_dates。
两个日志日期格式是
-
MM/DD/YYYY MM:SS
(或 M / d /yyyy m :ss(或 - 处于适当的DateTime格式
我无法将Log_Date
转换为datetime
字符,因为其中还有其他数据类型(单词,符号,数字及符号等(可以阻止转换。
如何将MM/DD/YYYY MM:SS
的varchar 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