1

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

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

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

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

我遇到的问题是每一列都有不同的宽度,因为日志文件不能被整齐地分隔,使得使用CHARINDEX返回一个数字或有时为 NULL 之类的东西。

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

我最好的方法是什么?使用CASE,SUBSTRINGCHARINDEX?

4

4 回答 4

3

尝试这个

DECLARE @d varchar(50) = '16/Mar/2007:11:30:17'

SELECT CAST(STUFF(@d,CHARINDEX(':',@d),1,' ')  AS DATETIME)
于 2012-09-04T20:34:16.047 回答
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)
于 2012-09-05T08:51:08.103 回答
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)
于 2012-09-04T19:30:40.573 回答
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)
于 2012-09-05T06:07:01.403 回答