繁体   English   中英

获取错误不允许从数据类型datetime到int的隐式转换。 使用CONVERT函数运行此查询。 在sql server中

[英]getting error Implicit conversion from data type datetime to int is not allowed. Use the CONVERT function to run this query. in sql server

我在sql server中是新手,我正在进行查询,当我运行查询时它给了我错误Implicit conversion from data type datetime to int is not allowed. Use the CONVERT function to run this query. Implicit conversion from data type datetime to int is not allowed. Use the CONVERT function to run this query. ,我尝试了所有可能的情况,仍然我无法解决它,这是我的SQL查询,任何人都可以请指向我为什么我收到此错误?

UPDATE [e]
    SET 
       [e].[LUPADays] = IIF((IIF(([p].[payer_type]) <> '1', 0, IIF([EpEnd] <= GETDATE(), 0, IIF([TotVisits] < 5, 1, 0)))) = 0, 0, CONVERT(datetime,EpEnd) - GETDATE())
FROM [tb_Episode] AS [e]
LEFT JOIN [tb_Payer] AS [p]
     ON([e].[CustID] = [p].[company_id])
       AND ([e].[PayorType] = [p].[payor_type])
LEFT JOIN [tb_HHPPS] AS [h]
     ON [e].[HHPPS] = [h].[HHPPS]
WHERE 
    [e].[billed_flag] = '0';    

从您自己的查询中,错误似乎是您正在直接比较EpEndGETDATE() ,而不进行转换。 您稍后会在查询中进行适当的转换,所以也可以在之前进行:

UPDATE [e]
SET 
   [e].[LUPADays] = IIF((IIF([p].[payer_type] <> '1', 0,
       IIF(CONVERT(datetime, EpEnd) <= GETDATE(), 0, IIF([TotVisits] < 5, 1, 0)))) = 0, 0, CONVERT(datetime, EpEnd) - GETDATE())
                  -- ^^^ change here
FROM [tb_Episode] AS [e]
LEFT JOIN [tb_Payer] AS [p]
     ON([e].[CustID] = [p].[company_id])
       AND ([e].[PayorType] = [p].[payor_type])
LEFT JOIN [tb_HHPPS] AS [h]
     ON [e].[HHPPS] = [h].[HHPPS]
WHERE 
    [e].[billed_flag] = '0';

顺便说一句, SET子句中的逻辑看起来很复杂。 可能还有一种简化方法。

编辑:

如果在对所有日期时间列进行适当的转换后,您仍然收到转换错误,那么我建议您在该列的某个位置存在错误数据。 这种错误是您不应将日期信息存储为文本的原因之一。

我认为你的字段[e].[LUPADays]属于INT类型,这就是当你尝试设置DATETIMEEpEnd - GETDATE()时出现错误的原因。 它应该是int

 UPDATE [e]
    SET 
        [e].[LUPADays] = CASE 
        WHEN [p].[payer_type] <> '1' 
            OR EpEnd <= DATEDIFF(day, 0, GETDATE()) 
            OR [TotVisits] >= 5 THEN 0
        ELSE EpEnd - DATEDIFF(day, 0, GETDATE())
        END
    FROM [tb_Episode] AS [e]
    LEFT JOIN [tb_Payer] AS [p]
         ON([e].[CustID] = [p].[company_id])
           AND ([e].[PayorType] = [p].[payor_type])
    LEFT JOIN [tb_HHPPS] AS [h]
         ON [e].[HHPPS] = [h].[HHPPS]
    WHERE 
        [e].[billed_flag] = '0';

UPD:看来你的字段EpEnd既不是INT也不是DATETIME但可能是VARCHAR ,所以你应该在这里进行一些转换: OR EpEnd <= DATEDIFF(day, 0, GETDATE())和这里EpEnd - DATEDIFF(day, 0, GETDATE())

我假设列[e].[LUPADays]是一个int。 你的IFF's结果是0CONVERT(datetime,EpEnd) - GETDATE() 最后一个表达式导致datetime ,sql server无法隐式转换为int。 你要找的是: SELECT DATEDIFF(DAY, GETDATE(), EpEnd)而不是减去日期时间。

此外,如果您不在所有内容周围添加括号,只会在需要的地方使用它们,这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM