smalldatetime的算术溢出错误

时间:2016-08-16 04:15:28

标签: sql datetime sql-server-2012 smalldatetime

COUNT(DISTINCT CASE WHEN DATEDIFF(d, ClientVisit.rev_timeout, ClientVisit.signature_datetime) = 3  THEN
   CASE WHEN ClientVisit.multiple_flag = 1 
        THEN ClientVisit.rev_timein 
        ELSE ClientVisit.clientvisit_id END 
      END

数据类型

  • rev_timeout - smalldatetime
  • rev_timein - smalldatetime
  • signature_datetime - datetime
  • multiple_flag - bit
  • clientvisit_id - int。

错误

  

将表达式转换为数据类型smalldatetime的算术溢出错误

SQL Server正在将clientvisit_id转换为 smalldatetime ,我不知道为什么,因为我在这里看不到与其他日期时间的比较。只是DATEDIFF returns a 3时的计数增量。有人可以解释为什么会发生这种情况并找到解决方案吗?

1 个答案:

答案 0 :(得分:2)

T-SQL中的

CASE表达式,最终返回单个原子值。因此,CASE表达式的所有部分都应返回相同的数据类型。

这是的情况!内部CASE返回

THEN ClientVisit.rev_timein 

是数据类型smalldatetime,而ELSE部分:

ELSE ClientVisit.clientvisit_id 

返回数据类型int的值。

T-SQL会尝试转换这些值according to this data type precedence列表,从而尝试将int转换为smalldatetime并失败。

学习内容CASE是一个表达式,它应该从所有它返回相同的数据类型 { {1}}和THEN分支......