从字符串转换日期和/或时间时转换失败 -

时间:2014-07-29 09:41:06

标签: sql sql-server-2008

我有以下查询:

declare @migdate as varchar(10)
set @migdate = 20140501
SELECT ID, (CASE WHEN a.HD ='abc' 
   THEN DATEADD(YEAR,1,a.LTST_DATE)
   ELSE 
       CASE WHEN DATEDIFF(MONTH,a.LTST_DATE,@MIGDATE) > 0
           THEN DATEADD(MONTH,DATEDIFF(MONTH,a.LTST_DATE,@MIGDATE)+1,a.LTST_DATE)
           ELSE '99991231'
       END
   END) AS NEXT_CHARGE_DATE
from table a

注意:表中的LTST_date也是varchar。

我收到错误

Conversion failed when converting date and/or time from character string.

我在这里做错了吗?

3 个答案:

答案 0 :(得分:0)

@migdate是一个varchar,那么如何对其进行datediffdateadd,它们是日期操作而不是字符串操作? 您需要将convertcast变量设置为datetimedatedatetime2数据类型。 即:

declare @var varchar(10) = '20050305'
select datediff(YYYY, getdate(), convert(datetime, @var, 100))

注意100是日期时间字符串的格式,请查看联机丛书中的各种格式。

同样在一种情况下,您返回日期时间类型(来自DateAdd),但在另一个分支中,您将返回一个varchar。该列中您需要哪种数据类型?

答案 1 :(得分:0)

函数DATEADD的第三个参数和函数DATEDIFF的第二个参数它们应该是日期。但在你的情况下,它们是字符串(你说表中的LTST_date是varchar)。因此,在函数中应用LTST_date之前,更改表格以使LTST_date为日期或将LTST_date从字符串转换为日期

答案 2 :(得分:0)

DECLARE @migdate AS DATE = '20140501'

SELECT  ID, 
        (
        CASE    WHEN a.HD ='abc'    THEN DATEADD(YEAR,1,a.LTST_DATE) 
                ELSE    CASE    WHEN DATEDIFF(MONTH,a.LTST_DATE,@MIGDATE) > 0 THEN DATEADD(MONTH,DATEDIFF(MONTH,a.LTST_DATE,@MIGDATE)+1,a.LTST_DATE) 
                ELSE '99991231' END END
        ) AS NEXT_CHARGE_DATE
FROM    [table] a