提取日期字符串的一部分并在T-SQL中转换为datetime

时间:2012-09-04 18:52:47

标签: tsql datetime sql-server-2008-r2 varchar

我在64位版本的Windows Server 2008 R2标准(sp1)上运行SQL Server Standard 2008 R2

我已将日志文件导入为平面文件源。名为col2的表中名为big的导入列中的一列包含如下值:16/Mar/2007:11:30:17varchar(50)

我想将该列(col2)转换为datetime数据类型。

我尝试的一种方法是提取日期字符串的每个部分,然后重新组合并转换它们。

我遇到的问题是每个列都有不同的宽度,因为日志文件无法整齐分隔,因此使用类似CHARINDEX的内容会返回单个数字或有时返回NULL。

我一直在尝试使用正则表达式使用CLR集成但无法使其工作(我无法在Visual Studio中创建C#项目,没有选项)并且主数据服务不会安装,因为SQL Server 2008 R2 Standard不支持它。

我最好的方法是什么?使用CASESUBSTRINGCHARINDEX

4 个答案:

答案 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)