2017-04-02 88 views
1

我試圖計算合同的年齡,但我得到的錯誤從數據類型日期INT顯式轉換是不允許

從數據類型日期爲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 

哪裏 「設置[開始]」 & 「[IB] [INSTALL_DATE]」 是DATETIME2值。

我很欣賞任何有幫助的想法。

謝謝。

+0

這是否涉及? http://stackoverflow.com/questions/5505935/convert-from-datetime-to-int「鑄造到一個int不再適用於最新版本的sql server'。嘗試使用'DATEDIFF(dd,'12/30/1899 ',mydatefield)'。 – redFur

+0

[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using- old-style-joins.aspx) - 在ANSI - ** 92 ** SQL標準(** 25年)中舊式*逗號分隔的表*樣式列表已替換爲* proper * ANSI'JOIN'語法**之前),它的使用是不鼓勵的。你應該**最肯定不是**混合這兩種風格! –

+0

所以,你有什麼建議?我應該使用什麼樣的「加入」? – BTurkeli

回答

0

也許這樣?

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 
+0

確切地說,謝謝! – BTurkeli

0

似乎轉換爲float/int在sql server的後一版本中不受支持。嘗試使用DATEDIFF(dd, '12/30/1899', mydatefield)

0

您可以先將這些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 
when datediff(year, [IB].[Install_Date], Setup.[Start]) > 0 
then datediff(year, [IB].[Install_Date], Setup.[Start]) 
else 0 
end as AGE 
+0

EXACTLY , 謝謝! – BTurkeli

相關問題