我正在尝试计算合约的年龄,但是我收到了错误
不允许从数据类型日期到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 值。
答案 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