关于数据类型转换的问题
sqlserver吧
全部回复
仅看楼主
level 1
8900936 楼主
DECLARE
@贴吧用户_00000D1 INT = 10 DECLARE
@贴吧用户_00000eC🐾 INT = 30 DECLARE
@TABLENAME VARCHAR (MAX) = '' DECLARE
@sql VARCHAR (MAX) = ''
WHILE (@i >= 0)
BEGIN
SET @tablename = 'ibs_history_hvac_' + CONVERT (
CHAR (10),
LEFT (
CONVERT (
CHAR (10),
getdate() -@m *@i,
112
),
6
)
)
SET @SQL =@SQL + ' SELECT
ibs_item.code as 传感器,CONVERT(NUMERIC(7,4),AVG(CONVERT(float (6),' +@tablename + '.value)))/10000 as CO2,
CONVERT(VARCHAR(16),' +@tablename + '.datetime,102)AS 日期 FROM ' +@tablename + ' LEFT JOIN ibs_item_parameter ON ' +@tablename + '.code = ibs_item_parameter.code
LEFT JOIN ibs_item ON ibs_item.id = ibs_item_parameter.item_id
WHERE (SUBSTRING(CONVERT(CHAR(23),' +@tablename + '.datetime, 120),15,2) >= 0
AND SUBSTRING(CONVERT(CHAR(23),' +@tablename + '.datetime, 120),15,2) <= 14)
AND SUBSTRING(CONVERT(CHAR(23),' +@tablename + '.datetime, 120),12,2) >= 9
AND SUBSTRING(CONVERT(CHAR(23),' +@tablename + '.datetime, 120),12,2) <= 23
GROUP BY CONVERT(VARCHAR(16),' +@tablename + '.datetime,102),ibs_item.code,ibs_item_parameter.name,ibs_item.name
HAVING ibs_item_parameter.name = ''CO2'' OR ibs_item_parameter.name = ''回风CO2浓度'' UNION ALL'
SET @i =@i - 1
END
SET @SQL = SUBSTRING (
@SQL,
1,
len(@SQL) - LEN('UNION ALL')
) EXEC (@SQL) PRINT @SQL
[Err] 22003 - [SQL Server]将 float 转换为数据类型 numeric 时出现算术溢出错误。
查询完毕后报错,上面的查询语句是一个连接数据库内多个月份的数据表进行连接查询,其中最关键的一列是CO2的数值,这一列是数值型的,但是由于传感器在传输或者数据库在写入数值时发生了一些错误或者畸变,导致实际写入到某个固定时刻点的数值变味了乱码,因此,在上面的语句中由于存在平均值计算,这就导致这部分异常的数据无法生成平均值,从而报错,求大神指点,如何可以忽略这种类型的错误,从而让绝大多数
正确的
值被计算出来。
2020年11月20日 14点11分 1
level 6
你的numeric 正常情况下能比float精度还要高。
估计你限制了numeric的整数最大值了。
别以为动态SQL我就看不懂了。
CONVERT(NUMERIC(7,4),AVG(CONVERT(float (6),' +@TABLENAME + '.value)))/10000
你这为什么要限制float (6)?明明后面还要除10000(估计是精确到0.1毫秒),您能保证表中value平均值不超过999999就会报你发的错误了。
别那么抠门,把值调大一点吧。
2020年11月30日 07点11分 2
1