2013-09-10 33 views
0

我在我的SQL Server表中有MeasureDateTimenvarchar(50))列。操纵字符串以提取日期时间

我需要得到

|measureFilePath | MeasureDateTime  |  MeasureName  | 
    | 12Nc121   |Thu Jun 19 15:00:05 2011| Annulus 4th RMS (Waves) | 
    | 12NB121   |Thu Jul 19 15:38:05 2012| 3.0mm 4th RMS (Waves) | 
    | 12NXc121  |Tue May 15 12:13:02 2012| BC (mm)     | 
    | 12NA121   |Tue May 15 12:13:02 2012| CT (mm)     | 
    | 12Nc111   |Tue May 15 12:13:02 2012| Reference Angle (deg.) | 
    | 12Nc231   |Wed May 15 12:03:02 2013| Temperature (C)   | 

我想最近6个月使用MeasureDateTime列数据,例如。

但问题是MeasureDateTimenvarchar类型。

任何人都知道如何做到这一点?它甚至有可能吗?

+5

为什么你将日期时间存储为字符串? –

+0

如果您可以控制表格,并且可以使用ALTER TABLE,则应考虑将此列更改为日期时间。 – rajah9

+0

我的猜测是这样从一些进口来源,而不是SQL了解的标准日期格式 - 因此,varchar存储 –

回答

2

尝试

CONVERT(datetime,SUBSTRING(MeasureDateTime,4,100),101) 

到VARCHAR列转换为datetime格式。

SUBSTRING(MeasureDateTime,4,100)删除日期字符串的工作日部分,并且格式为101CONVERT()调用将接受美式日期格式。

的选择可能看起来像

SELECT * FROM table WHERE DATEADD(month, 6, CONVERT(datetime,SUBSTRING(MeasureDateTime,4,100),101)) > getdate() 

我以前忽略的插入时间信息。在这里再次尝试日期转换:

convert(datetime,substring(stuff(dt,11,0,right(dt,5)),4,21),101) 

这种方法依赖于相等的字符串长度。我不确定这是否是给定的。

+0

它不起作用,但一个好的想法...我会去工作soem更多...错误信息:转换日期和/或时间从字符串转换失败。 – Angelina

1

这是一个有点令人费解,但可能工作:

WHERE DATEDIFF(Month, CAST(RIGHT(MeasureDateTime, LEN(MeasureDateTime) - 4) as datetime), GETDATE()) <= 6 
0

尝试插入使用时触发此表。试用@ cars10提供的解决方案获取日期并将其存储在datetime字段中。始终将日期时间字段保留为datetime而不是varchar字段。稍后您必须根据日期检索记录,并且此datetime字段将证明是有用的。