簡體   English   中英

從字符串轉換日期和/或時間時轉換失敗 -

[英]Conversion failed when converting date and/or time from character string -

我有以下查詢:

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.

我在這里做錯了什么嗎?

@migdate是一個 varchar,所以你怎么能在它上面做一個datediffdateadd ,它們是日期操作而不是字符串操作? 您需要convert變量convertcast convertdatetimedatedatetime2數據類型。 IE:

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

請注意 100 是日期時間字符串的格式,請在聯機叢書中查找各種格式。

同樣在一種情況下,您返回一個日期時間類型(來自 DateAdd),但在另一個分支中您返回一個 varchar。 您在該列中需要什么數據類型?

DATEADD 函數的第三個參數和 DATEDIFF 函數的第二個參數應該是日期。 但是在您的情況下,它們是字符串(您說表中的 LTST_date 是 varchar)。 因此,要么更改表,使 LTST_date 為日期,要么在函數中應用 LTST_date 之前將 LTST_date 從字符串轉換為日期

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM