我在 SQL Server 2012 中有一个表,其中使用内置 Windows 进程填充了 Windows perfmon 数据。该表是由该过程自动创建的。问题是时间戳字段是一个 char
但我需要一个 datetime
。
我在生成的表上使用 View 将数据转换为可用的形式,并且我想将时间戳转换为 View 中的日期时间。由于某种原因,我尝试的任何操作都会出现此错误:
Conversion failed when converting date and/or time from character string.
我可以将表中的时间戳值复制并粘贴到转换查询中,它的工作原理如下:
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
我通过选择具有已知正确格式的特定行排除了行中的一些奇怪格式,但我仍然遇到相同的错误。
我错过了什么?
编辑 重申一下,表中的所有值都采用相同的格式。该表是由将 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,我用 View 聚合它们。我想在创建这个 View 时进行转换。 https://logicalread.com/writing-performance-data-sql-server-mo01/#.WuxgzYgvyzU
我感兴趣的 CounterDateTime 列是长度为 24 的可为空字符。
最佳答案
我按照您的指示进行了测试,并且能够重现
SELECT ASCII(RIGHT(CounterDateTime, 1))
FROM dbo.CounterData
返回 0,这就是我认为您的数据无法转换的原因。所以基本上 最后一个字符为 ASCII 空。
解决方法是
SELECT CAST(LEFT(CounterDateTime, 23) AS DATETIME)
FROM dbo.CounterData
关于sql - 无法将 Windows 计数器表中的字符转换为日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50174801/