如何查找选择转换失败的值

问题描述 投票:1回答:3

我从数据核心查询nvarchar,所有值都是'00:00:00'格式。我想将它转换为long。当我尝试转换前1000时它工作正常但所有值都有问题。查询显示如下

SELECT DATEDIFF(second, '00:00', CAST(TimeSpent AS time(7)))* cast(1000 as bigint) + RIGHT(CAST(TimeSpent AS time(7)),7) FROM [mtr].[MatterDocument]

错误陈述是

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

如何找到无法转换的值?

sql sql-server
3个回答
2
投票

我建议你的MatterDocument表中有一些不良数据。 SQL Server不支持正则表达式搜索,但幸运的是它的LIKE运算符支持一些我们可以使用的原始正则表达式:

SELECT *
FROM [mtr].[MatterDocument]
WHERE TimeSpent NOT LIKE '[01][0-9]:[0-5][0-9]:[0-5][0-9]' AND
      TimeSpent NOT LIKE '2[0-3]:[0-5][0-9]:[0-5][0-9]';

Demo

您可以在演示中验证正在刷新坏的,不可接受的时间字符串。上面的查询也应该用于清除可能根本不是时间值的字符串,并以某种方式将其放入您的表中。

最好的长期修复方法是在源头更正数据,然后将数据作为真正的日期/时间类型引入SQL Server。

编辑:TRY_CAST,正如@Denis在他的回答中所描述的,可能是另一种方法。但这需要SQL Server 2012或更高版本。上述查询仍应在早期版本中使用。


1
投票

尝试使用TRY_CAST函数查找错误的行(如果无法转换该值,则返回NULL)

SELECT c.TimeSpent, /*Any columns to identify rows */
FROM (
SELECT TimeSpent, /*Any columns to identify rows */ 
DATEDIFF(second, '00:00', TRY_CAST(TimeSpent AS time(7)))* cast(1000 as bigint)
 + RIGHT(TRY_CAST(TimeSpent AS time(7)),7) AS Converted
FROM [mtr].[MatterDocument]
) c
WHERE Converted IS NULL

1
投票

你应该找到坏的价值观:

select timespent
from t
where try_cast(TimeSpent AS time(7)) is null;

这将使您能够找到错误的值。它们可能超过23倍。

我建议更简单地进行转换:

select (left(TimeSpent, 2) * 60 * 60 + 
        substring(TimeStpent, 4, 2) * 60 +
        right(TimeSpent, 2)
       ) as seconds

这将进行转换,不受SQL Server time数据类型的限制。

© www.soinside.com 2019 - 2024. All rights reserved.