Sql 无法将windows计数器表中的字符转换为日期时间

Sql 无法将windows计数器表中的字符转换为日期时间,sql,sql-server,datetime,sql-server-2012,Sql,Sql Server,Datetime,Sql Server 2012,我在SQL Server 2012中有一个表,该表使用内置的Windows进程填充了Windows perfmon数据。该表由该过程自动创建。问题是时间戳字段是一个char,但我需要一个datetime 我在生成的表上使用视图将数据转换为可用的形式,并希望将时间戳转换为视图中的日期时间。出于某种原因,我尝试的任何东西都会产生以下错误: 从字符串转换日期和/或时间时,转换失败 我可以将时间戳值从表复制并粘贴到convert查询中,其工作原理如下: SELECT convert(datetime,

我在SQL Server 2012中有一个表,该表使用内置的Windows进程填充了Windows perfmon数据。该表由该过程自动创建。问题是时间戳字段是一个
char
,但我需要一个
datetime

我在生成的表上使用视图将数据转换为可用的形式,并希望将时间戳转换为视图中的日期时间。出于某种原因,我尝试的任何东西都会产生以下错误:

从字符串转换日期和/或时间时,转换失败

我可以将时间戳值从表复制并粘贴到convert查询中,其工作原理如下:

SELECT convert(datetime, '2018-04-04 00:00:08.022', 121);

但是,当我试图直接从表中转换值时,我得到了错误:

SELECT convert(datetime, counterDateTime, 121) from counterData
我已经排除了行中一些奇怪的格式,选择了一个具有已知正确格式的特定行,但仍然得到相同的错误

我错过了什么

编辑 只是重申一下,表中的所有值都采用相同的格式。该表是由将perfmon数据写入数据库的Windows进程自动创建的。我无法控制表中数据的格式。这并不特定于我正在测试的行以外的行,而是与所有行相关

例如:

select counterDateTime from counterData where recordindex = '82331' and counterID = '1'
= 2018-04-04 00:00:08.022

select cast('2018-04-04 00:00:08.022' as datetime)
= 2018-04-04 00:00:08.023

select convert(datetime, '2018-04-04 00:00:08.022', 121)
= 2018-04-04 00:00:08.023

select cast(counterDateTime as datetime) from CounterData where recordIndex = '82331'  and counterID = '1'
= Msg 241, Level 16, State 1, Line 109
Conversion failed when converting date and/or time from character string.
下面是一个将Windows计数器数据导入数据库的示例教程。这是一个相当标准的过程,网上有更多的例子。有趣的表是CounterData和CounterDetails,我用视图聚合它们。正是在创建这个视图的过程中,我想进行转换。


我感兴趣的CounterDateTime列是一个长度为24的可空字符。

我按照您的说明进行了测试,并且能够复制

SELECT ASCII(RIGHT(CounterDateTime, 1))
FROM dbo.CounterData
返回0,这就是我认为您的数据无法转换的原因。所以基本上 最后一个字符是ASCII null

解决方法是

SELECT CAST(LEFT(CounterDateTime, 23) AS DATETIME)
FROM dbo.CounterData

非常感谢你花时间在这件事上,我就是想不出来。现在一切正常,符合我的可视化代码。我觉得有点奇怪,Windows进程会将日期存储为字符并导致这种情况。我将研究一种与微软沟通的方式,至少应该在文档中注明。
SELECT CAST(LEFT(CounterDateTime, 23) AS DATETIME)
FROM dbo.CounterData