【问题标题】:Conversion failed when converting date and/or time from character string -从字符串转换日期和/或时间时转换失败 -
【发布时间】:2014-07-29 09:41:06
【问题描述】:

我有以下查询:

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.

我在这里做错了吗?

【问题讨论】:

  • 您检查过LTST_date 的值是否格式错误,例如像“20141305”这样的值?
  • LTST_DATE 值是否都是有效日期?

标签: sql sql-server-2008


【解决方案1】:

@migdate 是一个varchar,那么你怎么能在它上面做一个datediffdateadd,它们是日期操作而不是字符串操作? 您需要将convertcast 变量转换为datetimedatedatetime2 数据类型。 即:

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

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

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

【讨论】:

  • 我需要列中的日期时间。
  • 在这种情况下,在字符串“99991231”周围添加convert
  • 谢谢,其中一个日期的日期无效,这就是它抛出错误的原因。但是感谢您的帮助,您的投入在学习中增加了价值。
【解决方案2】:

函数DATEADD的第三个参数和函数DATEDIFF的第二个参数应该是日期。但在您的情况下,它们是字符串(您说表中的 LTST_date 是 varchar)。所以要么改变你的表,让 LTST_date 是一个日期,要么在函数中应用 LTST_date 之前将 LTST_date 从字符串转换为日期

【讨论】:

  • 感谢您的输入,虽然它们是 varchar -,但它们是日期格式。由于其中一个日期值不正确,因此引发错误。它现在起作用了。感谢您的投入。
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多