首页 > 解决方案 > 为什么这个 char 值不转换为日期时间?

问题描述

我有一个性能监视器实例,将数据保存到 MS SQL 服务器数据库上的表中。性能数据保存到名为 CounterData 的表中。该表有一个 char(24) 字段 (counterdatetime) 用于存储数据的日期/时间。我试图将该字段视为日期时间数据,但我不断收到“从字符串转换日期和/或时间时转换失败”。

以下是来自 counterdatetime 的数据示例:2019-07-02 09:19:46.300

我尝试了 CAST 和 CONVERT 的不同变体,以允许我将这些数据作为日期时间处理。例如:

SELECT CAST(counterdatetime as datetime) from CounterData
SELECT CAST(counterdatetime as datetime2) from CounterData
SELECT CONVERT(datetime,counterdatetime,101) from CounterData

每个都给我“转换失败......” 错误。我想也许失败是由一条记录中的虚假值触发的,所以我尝试使用指定一个好值的 WHERE 表达式来限制转换。我还尝试转换值本身,如:

SELECT CAST('2019-07-02 09:19:46.300' as datetime)

在这种情况下,CAST 起作用。

为什么当我从表中选择值时它不起作用?

更新

@Jeroen Mostert 在评论中提供了答案,我将其作为答案发布。

标签: sql-servertsql

解决方案


我不确定文字'2019-07-02 09:19:46.300'是否是实际使您的查询崩溃的文本值。如果您使用的是 SQL Server 2012 或更高版本,则有一个帮助函数TRY_CONVERT将尝试将输入字符串转换为特定类型(在本例中为日期时间),并且将返回转换后的日期时间值,或者NULL如果转换失败。

尝试运行以下查询:

SELECT
    counterdatetime
FROM CounterData
WHERE
    TRY_CONVERT(datetime, counterdatetime) IS NULL;

如果您在结果集中看到任何记录,则表示这些值无法成功转换。


推荐阅读