我从数据核心查询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]
错误陈述是
从字符串转换日期和/或时间时转换失败
如何找到无法转换的值?
我建议你的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或更高版本。上述查询仍应在早期版本中使用。
尝试使用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
你应该找到坏的价值观:
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
数据类型的限制。