【问题标题】:Date Field data types varchar are incompatible with subtract operator in SSMS日期字段数据类型 varchar 与 SSMS 中的减法运算符不兼容
【发布时间】:2018-08-20 09:44:20
【问题描述】:

我已尝试搜索此问题的答案,但我找到的解决方案均无效。

我需要从另一个中减去 2 个日期字段:datearrival - 离开日期,但它们都是 varchar,因此减法运算符不起作用。

有人可以在代码中给我一个答案,或许可以使用 cast 和/或 date diff 来完成这项工作吗?

我当前的代码是:

DATEDIFF(dd,[ARRIVDAT],current_timestamp)-(dd,[DEPARTDAT],currenttimestamp) AS LengthOfStay

这会突出显示无法识别的列名,即使在查询的其余部分中,多绑定标识符也没问题。

请问有什么好的答案吗?

【问题讨论】:

  • 修复您的架构,不要将日期存储为字符串。使用datedatetime 或类似类型。也就是说,您是否尝试过 convert(date, arrivdat) 之类的方法?
  • 编辑问题添加一些示例数据和所需的结果会有所帮助。
  • (dd,[DEPARTDAT],currenttimestamp) 本身没有任何意义。这是否意味着某种函数调用? (例如,另一个 DATEPART 调用)如果是这样,您忘记提供函数名称。
  • @sticky bit 谢谢,你提供了正确的答案。

标签: sql sql-server sql-server-2016


【解决方案1】:
declare @ARRIVDAT varchar(12) ='1JAN18', @DEPARTDAT varchar(12) = '2FEB18'
select DATEDIFF(dd, @ARRIVDAT, @DEPARTDAT) LengthOfStay

我认为它会进行隐式转换。您也不需要强制转换或转换。

【讨论】:

    【解决方案2】:

    你想要函数DATEDIFF()。您可以转换值:

    DATEDIFF(day, CONVERT(date, ARRIVDAT]), CONVERT(date, DEPARTDAT) AS LengthOfStay
    

    如果隐式转换不起作用,请仔细阅读 documentation 以了解合适的格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多