【问题标题】:Explicit conversion from data type date to int is not allowed不允许从数据类型 date 到 int 的显式转换
【发布时间】:2017-08-27 12:39:29
【问题描述】:

我正在尝试计算合同的 AGE,但出现错误

不允许从数据类型 date 到 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

其中 "Setup.[Start]" & "[IB].[Install_Date]" 是 datetime2 值。

【问题讨论】:

  • 这有关系吗? stackoverflow.com/questions/5505935/…“在最新版本的 sql server 中,转换为 int 不再有效”。尝试使用 DATEDIFF(dd, '12/30/1899', mydatefield)
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 年前),不鼓励使用。你应该绝对不混合这两种风格!
  • 那么,你有什么建议?我应该使用哪种join

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


【解决方案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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 2015-09-26
        • 2023-03-11
        相关资源
        最近更新 更多