2017-04-02 83 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

相关问题