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_N
和 tmp_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如何使用date数据类型将日期插入到列中