无法在Windows计数器表

时间:2018-05-04 12:18:44

标签: sql sql-server datetime sql-server-2012

我在SQL Server 2012中有一个表,它使用内置的Windows进程填充了Windows perfmon数据。该表由此过程自动创建。问题是时间戳字段是char,但我需要datetime 我在生成的表上使用视图将数据转换为可用的表单,我想将时间戳转换为视图中的日期时间。出于某种原因,我尝试的任何东西都给了我这个错误:

  

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

我可以将表中的时间戳值复制并粘贴到转换查询中,它可以正常工作,如下所示:

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

 SELECT cast('2018-04-04 00:00:08.022' as datetime)

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

SELECT convert(datetime, counterDateTime, 121) from counterData

我通过选择具有已知正确格式的特定行排除了行中的一些奇怪格式,但我仍然得到相同的错误。

我错过了什么?

修改 重申一下,表中的所有值都采用相同的格式。该表是由将进程数据写入数据库的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,我用视图聚合。正是在这个视图的创建中,我想进行转换。 https://logicalread.com/writing-performance-data-sql-server-mo01/#.WuxgzYgvyzU

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

1 个答案:

答案 0 :(得分:1)

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

SELECT ASCII(RIGHT(CounterDateTime, 1))
FROM dbo.CounterData

返回0,这就是我相信您的数据无法转换的原因。所以基本上 最后一个字符是ASCII null。

解决方法是

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