【问题标题】:Unable to validate DATE format due to Msg 8116由于消息 8116,无法验证 DATE 格式
【发布时间】:2014-10-02 17:38:15
【问题描述】:

我有 TRANSACTIONS 表和 col BUSINESS_DATE (varchar 255)。

distinct LEN(BUSINESS_DATE) = 6 and 8
--Sample data for BUSINESS_DATE
071312   --mmddyy for LEN = 6
08012012 --mmddyyyy for LEN = 8

我想在 TABLE SUNNY 中加载这些日期作为 DATE。这是我的 CASE 声明 -

select CASE WHEN LEN(BUSINESS_DATE) = 6
                THEN CAST('20' + RIGHT(GRAND.[BUSINESS_DATE],2) + LEFT(GRAND.[BUSINESS_DATE],4) AS DATE)
                WHEN LEN(BUSINESS_DATE) = 8
                THEN CAST(RIGHT(GRAND.[BUSINESS_DATE],4) + LEFT(GRAND.[BUSINESS_DATE],4) AS DATE)
                END                                                AS TRANS_DT
    into SUNNY
    from TRANSACTIONS GRAND

所有记录都已加载。现在,当我尝试执行以下查询来测试日期格式时,它会抛出错误消息 8116。任何人都可以解释这里出了什么问题,如何我可以测试它吗?

select top 5 * from
SUNNY
where ISDATE(TRANS_DT) = 1

【问题讨论】:

  • 如果SUNNY.TRANS_DT 列是日期类型(我认为您的问题是这样),则所有记录均已加载且没有转换错误的事实证明您的日期是有效的。

标签: sql sql-server sql-server-2008 date


【解决方案1】:

ISDATE 函数不能使用 DATE 作为它的参数;文档说明参数:

是一个字符串或表达式,可以转换为 字符串。表达式必须少于 4,000 个字符。 日期和时间数据类型,除了 datetime 和 smalldatetime,不是 允许作为 ISDATE 的参数。

因此,要么在选择语句中将值转换为 DATETIME 而不是 DATE,要么将 ISDATE 的参数转换为 NVARCHAR。

测试似乎没有必要,因为 SELECT...INTO 的结果应该是正确的日期,否则演员表会失败并且不会向 SUNNY 插入任何数据。

【讨论】:

    【解决方案2】:

    试试这个代码插入到阳光表。然后检查 如果 GRAND.[BUSINESS_DATE] 列是 varchar 类型,则删除转换函数。

    select CASE WHEN LEN(BUSINESS_DATE) = 6
                THEN CAST('20' + convert(varchar(5),RIGHT(GRAND.[BUSINESS_DATE],2))+'-'+ LEFT(GRAND.[BUSINESS_DATE],2)+'-'+substring(GRAND.[BUSINESS_DATE],3,2)) AS DATE)
                WHEN LEN(BUSINESS_DATE) = 8
                THEN CAST(RIGHT(GRAND.[BUSINESS_DATE],4) + RIGHT(GRAND.[BUSINESS_DATE],2))+'-'+ LEFT(GRAND.[BUSINESS_DATE],2)+'-'+substring(GRAND.[BUSINESS_DATE],3,2)) AS DATE)
                END                                                AS TRANS_DT
    into SUNNY
    from TRANSACTIONS GRAND
    

    【讨论】:

    • 我没有机会检查语法错误。所以有可能会出现语法错误