代码之家  ›  专栏  ›  技术社区  ›  Md. Abdul Alim

如何查找选择转换失败值

  •  1
  • Md. Abdul Alim  · 技术社区  · 8 年前

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

    如何找到转换失败的值?

    3 回复  |  直到 8 年前
        1
  •  2
  •   Tim Biegeleisen    8 年前

    我认为你的报告中有一些不好的数据 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或更高版本。上面的查询应该在早期版本中仍然有效。

        2
  •  1
  •   Denis Rubashkin    8 年前

    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
    
        3
  •  1
  •   Gordon Linoff    8 年前

    您应该找到错误的值:

    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