由于Msg 8116,无法验证DATE格式

时间:2014-10-02 17:38:15

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

我有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

2 个答案:

答案 0 :(得分:4)

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

  

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

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

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

答案 1 :(得分:0)

尝试将此代码插入到阳光表中。然后检查  如果GRAND。[BUSINESS_DATE]列是varchar类型,则删除convert function。

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