【问题标题】:Operand type clash: int is incompatible with date, UNION ALL, NULL value操作数类型冲突:int 与日期、UNION ALL、NULL 值不兼容
【发布时间】:2021-09-24 10:44:09
【问题描述】:

当我收到这个错误时,我完全糊涂了: '操作数类型冲突:int 与日期不兼容'

我有以下查询,其中出现错误:

select top 1 a.[ID], a.[DateA], a.[DateD]  from  view1 a where a.ID]=1
union all 
(select top 1 a.[ID], a.[DateA], a.[DateD] from view2 a where a.[ID]=2 ) 

数据:

ID  DateA                       DateD
1   2021-01-09 00:00:00.000     NULL
2   2006-11-27 00:00:00.000     NULL

但是,如果我更改查询,因此“DateD”列直接为空,那么它工作正常,没有错误:

 select top 1 a.[ID], a.[DateA], null as [DateD]  from  view1 a where a.ID]=1
    union all 
 (select top 1 a.[ID], a.[DateA], a.[DateD] from view2 a where a.[ID]=2 ) 

在第一个视图(引擎盖下)我有 选择 NULL 作为 [DateD] 在第二个视图(引擎盖下)我有: 选择 CAST(DateD AS DATE) AS [DateD]

有什么问题?

【问题讨论】:

  • 检查您的视图,[DateD] 在第一个视图中将是 int。在视图中使用CONVERT(DATE, NULL) 修复它
  • UNION (ALL) 中的数据集必须具有相同的定义。显然他们没有,因此错误。这表明您的“日期”列之一不是date,而是int(我认为这是一个设计缺陷)。
  • 我保证view1 中没有名为ID] 的列,这意味着您向我们展示的代码只能猜测 产生您所问的错误因为你从来没有运行过这段代码。我建议您花一点时间在临时数据库中创建一些模拟数据和表,直到您有一个生成错误的实际查询,然后请发布所有这些详细信息所以我们可以在本地重新创建问题。

标签: sql sql-server


【解决方案1】:

当 SQL Server 遇到NULL 并且必须找出类型时,默认为int。如果你这样做,你可以很容易地看到这一点:

select null as x
into t;

再看x的定义(见here)。

因此,要获得不同类型的 NULL,请将其强制转换:

select cast(null as date) as x

您需要在视图中执行此操作。

【讨论】:

  • 谢谢,这是正确的,它成功了。
猜你喜欢
  • 2019-10-31
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
相关资源
最近更新 更多