我从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]
错误声明为
从字符串转换日期和/或时间时转换失败
如何查找转换失败的值?
答案 0 :(得分: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]';
您可以在演示中验证是否清除了错误的,不可接受的时间字符串。上面的查询也应该能够清除可能根本不是时间值的字符串,并以某种方式将其放入表中。
最好的长期解决办法是从源头更正数据,然后将数据作为真正的日期/时间类型带入SQL Server。
编辑:TRY_CAST
(如@Denis在其答案中所述)可能是另一种方法。但这需要SQL Server 2012或更高版本。上面的查询在早期版本中仍然可以使用。
答案 1 :(得分: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
答案 2 :(得分: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
数据类型的限制。