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

时间:2018-12-13 15:14:18

标签: sql sql-server

由于数据类型的原因,我无法将数据从一个表传递到另一个表。 我尝试将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

这是我收到的另一条消息:消息206,级别16,状态2,第25行 操作数类型冲突:数字与时间不兼容

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

@PanagiotisKanavos在注释中提到的解决方案是显式列出最终SELECT * FROM...中的列。该SELECT语句中的列顺序与目标表中INSERT所插入的列不对齐。

您可能需要运行查询的临时实例来整理列顺序。然后为将来的维护提供帮助,并确保在所有列出的列中包括表别名,以便您(或接下来必须查看代码的人)可以轻松地确定数据是否来自[VHA].[dbo].[tmp_sensor_info]#tmp1

这只是在生产代码中使用SELECT *的许多危险之一。关于这个问题,对此问题进行了大量讨论:Why is SELECT * considered harmful?

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