代码之家  ›  专栏  ›  技术社区  ›  Tewr

tsql中的暂定日期

  •  2
  • Tewr  · 技术社区  · 16 年前

    在我的例子中,我从xml列中提取一些日期数据。

    如果在xml中找到的数据段无法转换为datetime(在这种特定情况下,日期在某些情况下为“0001-01-01”),则以下查询将抛出“算术溢出错误,将表达式转换为数据类型datetime”。有没有办法在异常发生之前检测到它?

    select
          [CustomerInfo].value('(//*:InceptionDate/text())[1]', 'datetime')
      FROM Customers
    

    TRYCAST(expr, totype, defaultvalue) :

    select
          TRYCAST(
           [CustomerInfo].value('(//*:InceptionDate/text())[1]', 'nvarchar(100)'), 
           datetime, 
           null)
      FROM Customers
    
    1 回复  |  直到 16 年前
        1
  •  3
  •   Tomalak    16 年前

    当节点小于SQL Server允许的最小日期时间时,可以尝试排除该节点:

    SELECT
      [CustomerInfo].value('(//*:InceptionDate/text())[1][.>=''1753-01-01'']', 'datetime')
    FROM 
      Customers
    

    SELECT
      CASE 
        WHEN ISDATE([CustomerInfo].value('(//*:InceptionDate/text())[1]'))
        THEN CONVERT(DATETIME, [CustomerInfo].value('(//*:InceptionDate/text())[1]'))
        ELSE NULL
      END
    FROM 
      Customers