我在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的可空字符。
答案 0 :(得分:1)
我按照您的说明进行了测试,并且能够重现
SELECT ASCII(RIGHT(CounterDateTime, 1))
FROM dbo.CounterData
返回0,这就是我相信您的数据无法转换的原因。所以基本上 最后一个字符是ASCII null。
解决方法是
SELECT CAST(LEFT(CounterDateTime, 23) AS DATETIME)
FROM dbo.CounterData