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