我在64位版本的Windows Server 2008 R2标准(sp1)上运行SQL Server Standard 2008 R2
我已将日志文件导入为平面文件源。名为col2
的表中名为big
的导入列中的一列包含如下值:16/Mar/2007:11:30:17
为varchar(50)
。
我想将该列(col2
)转换为datetime
数据类型。
我尝试的一种方法是提取日期字符串的每个部分,然后重新组合并转换它们。
我遇到的问题是每个列都有不同的宽度,因为日志文件无法整齐分隔,因此使用类似CHARINDEX
的内容会返回单个数字或有时返回NULL。
我一直在尝试使用正则表达式使用CLR集成但无法使其工作(我无法在Visual Studio中创建C#项目,没有选项)并且主数据服务不会安装,因为SQL Server 2008 R2 Standard不支持它。
我最好的方法是什么?使用CASE
,SUBSTRING
和CHARINDEX
?
答案 0 :(得分:3)
试试这个
DECLARE @d varchar(50) = '16/Mar/2007:11:30:17'
SELECT CAST(STUFF(@d,CHARINDEX(':',@d),1,' ') AS DATETIME)
答案 1 :(得分:2)
虽然我喜欢EricZ的想法,但是,这是我的解决方案
DECLARE @d varchar(50) = '16/Mar/2007:11:30:17'
SELECT CAST( LEFT(@d,PATINDEX('%:%',@d) - 1) + ' ' + SUBSTRING(@d,PATINDEX('%:%',@d) + 1,LEN(@d)) AS DATETIME)
答案 2 :(得分:1)
select convert(datetime,
SUBSTRING('16/Mar/2007:11:30:17', 0, CHARINDEX(':', '16/Mar/2007:11:30:17')) + ' ' +
SUBSTRING('16/Mar/2007:11:30:17', CHARINDEX(':', '16/Mar/2007:11:30:17') + 1, 8) , 1)
答案 3 :(得分:0)
试试这个>
select convert(datetime,STUFF(big,CHARINDEX(':',big),1,' '),101) from yourtable
示例:在此处检查日期时间字符串格式。如果它相同则可以使用
DECLARE @d varchar(50) = '16/Mar/2007:11:30:17'
select convert(datetime,STUFF(@d,CHARINDEX(':',@d),1,' '),101)