我已将表的每一列都以varchar(max)
或nvarchar(max)
数据类型上传到SQL Server。之所以这样做,是因为我从具有数百万条记录的.CSV
文件上传,并且我不想花很多时间清理数据,然后再将其输入SQL Server。
但是,我现在在Log_Date
列中拥有所有类型的字符。我能够确定我想要的两个格式化的log_dates。
两种日志日期格式为
MM/DD/YYYY MM:SS
(或 M / D / YYYY M :SS)或我无法将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
答案 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