不允许从数据类型日期到int的显式转换

时间:2017-04-02 17:19:10

标签: sql-server datetime sql-server-2012 type-conversion

我正在尝试计算合约的年龄,但是我收到了错误

  

不允许从数据类型日期到int的显式转换

这是我的代码:

SELECT 
    Contract_hist.*,
    IB.*,
    CAST((CASE
             WHEN (CAST(CONVERT(INT, Setup.[Start]) - CONVERT(INT,[IB].[Install_Date])) AS INT))/365 <= 0 
                THEN 0  
             WHEN (CAST(CONVERT(INT, Setup.[Start]) - CONVERT(INT,[IB].[Install_Date])) AS INT)) / 365 > 0 
                THEN (CAST(CONVERT(INT, Setup.[Start]) CONVERT(INT,[IB].[Install_Date])) AS INT)) / 365 
          END) AS INT) AS AGE
FROM 
    Setup, Contract_hist
INNER JOIN 
    IB ON Contract_hist.[System No] = IB.System_ID

在哪里&#34;设置。[开始]&#34; &安培; &#34; [IB] [INSTALL_DATE]&#34;是 datetime2 值。

3 个答案:

答案 0 :(得分:2)

也许这个?

SELECT 
Contract_hist.*
,IB.*
,CASE 
        WHEN DATEDIFF(year,[IB].[Install_Date], Setup.[Start] ) <= 0 THEN 0
        ELSE DATEDIFF(year, [IB].[Install_Date], Setup.[Start])
 END AS AGE

FROM Setup, Contract_hist
    INNER JOIN IB ON Contract_hist.[System No] = IB.System_ID

答案 1 :(得分:1)

在sql server的后一版本中不支持转换为float / int。尝试使用DATEDIFF(dd, '12/30/1899', mydatefield)

答案 2 :(得分:1)

您可以先将这些datetime2字段转换为datetime,然后转换为int。

(convert(int, convert(datetime, Setup.[Start])) - convert(int,convert(datetime, [IB].[Install_Date])))/365

但这可以缩短为:

cast(convert(datetime, Setup.[Start]) - convert(datetime, IB.[Install_Date]) as int)/365

或者您可以进一步简化它并直接用datediff计算年数差异:

datediff(year, [IB].[Install_Date], Setup.[Start])

CASE也可以简化:

case 
when datediff(year, [IB].[Install_Date], Setup.[Start]) > 0 
then datediff(year, [IB].[Install_Date], Setup.[Start])
else 0
end as AGE