【问题标题】:The conversion of a nvarchar data type to a datetime, data type resulted in an out-of-range value将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围
【发布时间】:2016-10-22 00:16:12
【问题描述】:

运行时异常:

将 nvarchar 数据类型转换为 datetime 数据类型 导致超出范围的值。

代码:

INSERT INTO [Migrated].[dbo].[MyTables] (LegacyId,DeedDate)
    SELECT DISTINCT 
        a.[IPLID], CONVERT(nvarchar(255), a.[Deeddate], 127) 
    FROM 
        [Legacy].[dbo].[MyTables2] as a
  • MyTables --> DeedDate datetime 允许 Null
  • MyTables2 --> Deeddate nvarchar(255) 允许 Null

希望我做得正确。但是为什么会出现上述错误呢?

我使用的是 SQL Server 2014 express。

注意:你能告诉我如何找出MyTables2 Deeddate 上的缺陷吗?我的意思是不同的日期格式等。或者用NULL替换这些日期。

【问题讨论】:

  • 您正尝试将nvarchar 插入datetime 列。错误信息很清楚。
  • 您的日期在 1.1.1753 之前(或 31.12.9999 之后)?
  • @vkp 这就是我转换它的原因。我错了吗?
  • 尝试使用越来越小的 MyTables2 集来准确确定导致问题的值。
  • 您仍在将其转换为 nvarchar。

标签: sql sql-server


【解决方案1】:

我已经使用ISDATE function 找出了缺陷日期并将其删除。之后它可以工作了。干杯:)

这样就可以了:

INSERT INTO [Migrated].[dbo].[MyTables] (LegacyId,DeedDate)
    SELECT DISTINCT 
        a.[IPLID], CONVERT(nvarchar(255), a.[Deeddate], 127) 
    FROM 
        [Legacy].[dbo].[MyTables2] as a

【讨论】:

    【解决方案2】:

    在 SQL Server 2012+ 中,您可以使用 TRY_CONVERT(),它将返回 NULL 而不是错误:

    INSERT INTO [Migrated].[dbo].[MyTables](LegacyId, DeedDate)
        SELECT DISTINCT a.[IPLID], TRY_CONVERT(nvarchar(255), a.[Deeddate], 127)
        FROM [Legacy].[dbo].[MyTables2] a;
    

    您还可以使用它来确定格式不正确的地方:

    SELECT a.*
    FROM (SELECT a.[IPLID], a.[Deeddate],
                 TRY_CONVERT(nvarchar(255), a.[Deeddate], 127) as datestr
          FROM [Legacy].[dbo].[MyTables2] a
         ) a
    WHERE datestr IS NULL;
    

    【讨论】:

    • 第一个查询这样写 'nvarchar' is not a recognized built-in function name. 为什么?
    • 我正在使用SQL server 2014 express
    • 完全不清楚为什么会返回该错误。在此查询的上下文中,nvarchar(255) 显然是一个数据类型声明。
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 2012-04-16
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2011-11-12
    相关资源
    最近更新 更多