Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 操纵字符串以提取日期时间_Sql Server 2008 - Fatal编程技术网

Sql server 2008 操纵字符串以提取日期时间

Sql server 2008 操纵字符串以提取日期时间,sql-server-2008,Sql Server 2008,我的SQL Server表中有MeasureDateTime(nvarchar(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.0

我的SQL Server表中有
MeasureDateTime
nvarchar(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)         |
例如,我想使用
MeasureDateTime
列获取最近6个月的数据

但问题是
MeasureDateTime
属于
nvarchar
类型

有人知道怎么做吗?甚至可能吗?

试试看

CONVERT(datetime,SUBSTRING(MeasureDateTime,4,100),101)
将varchar列转换为
datetime
格式

SUBSTRING(MeasureDateTime,4100)
删除日期字符串的工作日部分,并且
CONVERT()
使用格式
101
调用将接受US类型的日期格式

select可能看起来像

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)
这种方法依赖于相等的字符串长度。我不知道这是否是一个给定的

试试看

CONVERT(datetime,SUBSTRING(MeasureDateTime,4,100),101)
将varchar列转换为
datetime
格式

SUBSTRING(MeasureDateTime,4100)
删除日期字符串的工作日部分,并且
CONVERT()
使用格式
101
调用将接受US类型的日期格式

select可能看起来像

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)

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

这有点复杂,但可能有效:

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

其中DATEDIFF(Month,CAST(RIGHT(MeasureDateTime,LEN(MeasureDateTime)-4)作为datetime),GETDATE())这有点复杂,但可能有效:

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

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

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

为什么要将datetime存储为字符串?如果您可以控制表,并且可以更改表,您应该考虑将此列更改为DATETIME。我猜它是从某个导入源来的,而不是SQL理解的标准日期格式——因此VARARAR存储——您不应该将日期存储为字符串——那样您只是自找麻烦。使用
DATE
DATETIME
数据类型!为什么要将日期时间存储为字符串?如果您可以控制表,并且可以更改表,您应该考虑将此列更改为DATETIME。我猜它是从某个导入源来的,而不是SQL理解的标准日期格式——因此VARARAR存储——您不应该将日期存储为字符串——那样您只是自找麻烦。使用
DATE
DATETIME
数据类型!这不管用,但是一个好的想法。。。我会努力的,所以我更。。。错误消息:从字符串转换日期和/或时间时,转换失败。这不起作用,但是一个好主意。。。我会努力的,所以我更。。。错误消息:从字符串转换日期和/或时间时,转换失败。