SQL Server - 操作数类型冲突:数字与 datetimeoffset 不兼容

Posted

技术标签:

【中文标题】SQL Server - 操作数类型冲突:数字与 datetimeoffset 不兼容【英文标题】:SQL Server - Operand type ***: numeric is incompatible with datetimeoffset 【发布时间】:2018-12-13 15:14:18 【问题描述】:

由于数据类型,我在将数据从一个表传递到另一个表时遇到问题。 我尝试将 datetimeoffset 转换为日期,并插入到我将其作为日期类型的表中,但我仍然收到此错误。 这是我拥有的日期/时间格式: 2018-12-12 13:00:00 -05:00 在一张表中,我必须节省时间并将其插入新表中。我尝试使用 ,

CAST([from] AS date) DATE_FROM 

我可以将查询作为 select 运行并且它可以工作,但是当我尝试将数据插入到其他表中时,即使其他表已格式化并准备为日期类型,我仍然会遇到问题。

这是使用 datetimeoffset 存储数据的表:

[dbo].[tmp_count](
[elements_Id] [numeric](20, 0) NULL,
[content_Id] [numeric](20, 0) NULL,
[element_Id] [numeric](20, 0) NULL,
[element-name] [nvarchar](255) NULL,
[sensor-type] [nvarchar](255) NULL,
[data-type] [nvarchar](255) NULL,
[from] [datetimeoffset](0) NULL,
[to] [datetimeoffset](0) NULL,
[measurements_Id] [numeric](20, 0) NULL,
[measurement_Id] [numeric](20, 0) NULL,
[from (1)] [datetimeoffset](0) NULL,
[to (1)] [datetimeoffset](0) NULL,
[values_Id] [numeric](20, 0) NULL,
[label] [nvarchar](255) NULL,
[text] [tinyint] NULL

我正在尝试将带有 datetimeoffset 的列转换为日期和时间,并将其推送到 #tmp1 表

   SELECT [elements_Id]
  ,[content_Id]
  ,[element_Id]
  ,[element-name]
  ,[sensor-type]
  ,[data-type]
  ,CAST([from] AS date) DATE_FROM
  ,[to]
  ,[measurements_Id]
  ,[measurement_Id]
  ,CAST([from (1)] AS time (0)) TIME_FROM
  ,CAST([to (1)] AS TIME(0)) TIME_TO
  ,[values_Id]
  ,[label]
  ,[text]
  INTO #Tmp1
  FROM [VHA].[dbo].[tmp_count]

  SELECT 
  FROM #tmp1

这给了我 DATE_FROM 格式的时间为 2018-12-12,而 DATE_FROM 和 DATE_TO 的格式为 13:00:00,这正是我需要的。

现在我正在尝试将这张桌子与另一张桌子拼接起来,并将其推入决赛桌,如下所示:

[dbo].[tbl_ALL_DATA_N](
[serial-number] [nvarchar](255) NULL,
[ip-address] [nvarchar](255) NULL,
[name] [nvarchar](255) NULL,
[group] [nvarchar](255) NULL,
[device-type] [nvarchar](255) NULL,
[elements_Id] [numeric](20, 0) NULL,
[content_Id] [numeric](20, 0) NULL,
[element_Id] [numeric](20, 0) NULL,
[element-name] [nvarchar](255) NULL,
[sensor-type] [nvarchar](255) NULL,
[data-type] [nvarchar](255) NULL,
[DATE_FROM] [date] NULL,
[to] [datetimeoffset](0) NULL,
[measurements_Id] [numeric](20, 0) NULL,
[measurement_Id] [numeric](20, 0) NULL,
[TIME_FROM] [time](0) NULL,
[TIME_TO] [time](0) NULL,
[values_Id] [numeric](20, 0) NULL,
[label] [nvarchar](255) NULL,
[text] [tinyint] NULL

使用下面的查询:

INSERT INTO [dbo].[tbl_ALL_DATA_N]
        ([serial-number], 
         [ip-address], 
         [name], 
         [group], 
         [device-type], 
         [measurement_id], 
         TIME_FROM, 
         TIME_TO, 
         [content_id], 
         [elements_id], 
         [element-name], 
         [sensor-type], 
         [data-type], 
         DATE_FROM, 
         [to], 
         [element_id], 
         [measurements_id], 
         [values_id], 
         [label], 
         [text]) 
   SELECT * 
   FROM   [VHA].[dbo].[tmp_sensor_info] A 
   FULL OUTER JOIN #tmp1 B 
                ON 1 = 1

这是我收到的另一条消息:Msg 206, Level 16, State 2, Line 25 操作数类型冲突:数字与时间不兼容

有什么想法吗?

【问题讨论】:

您是否尝试将其转换为日期时间? [From] 的值是多少?而且,如果是日期,为什么不将其存储为 date 样本数据和期望的结果会有所帮助。 而且我们还需要澄清源数据的数据类型、目标列的数据类型以及您收到的错误的全文。 日期没有格式,它们是二进制值,就像数字类型一样。该错误抱怨您尝试混合使用 datetimeoffset 和数字列。很可能,tbl_ALL_DATA_Ntmp_sensor_info 有不同的列顺序,SELECT * FROM [VHA].[dbo].[tmp_sensor_info] A 以错误的顺序返回数据 【参考方案1】:

@PanagiotisKanavos 在 cmets 中提到的解决方案是明确列出最终 SELECT * FROM... 中的列。 SELECT 语句中的列顺序与您在目标表中 INSERT 进入的列不对齐。

您可能需要运行查询的临时实例来整理列顺序。然后帮自己一个忙以备将来维护,并确保在所有列出的列中包含表别名,以便您(或接下来必须查看代码的人)可以轻松找出数据是否来自 [VHA].[dbo].[tmp_sensor_info] 或 @ 987654327@。

这只是在生产代码中使用SELECT * 的众多危险之一。在这个问题上有很多关于这个问题的讨论:Why is SELECT * considered harmful?

此外,只要您在那里修复查询,就可以考虑使用有意义的表别名。请参阅:Bad habits to kick : using table aliases like (a, b, c) or (t1, t2, t3)。

【讨论】:

这解决了这个问题。感谢您对 select 语句和别名的所有帮助和建议

以上是关于SQL Server - 操作数类型冲突:数字与 datetimeoffset 不兼容的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 上使用用户定义的表类型的操作数类型冲突

sql server:处理空表类型

Sql Server如何使用date数据类型将日期插入到列中

操作数类型冲突:uniqueidentifier 与 float 不兼容

SQL Server 事务与锁

在sql server中修改表设计中某个字段的类型,老是提示我出错,如何解决