目录

目标

空气质量指数计算对照表

计算IAQI函数

计算AQI函数


目标

根据空气质量指数标准,通过调用MySQL函数来计算:二氧化硫(SO2)、二氧化氮(NO2)、一氧化碳(CO)、臭氧(O3)、臭氧8小时滑动(O38)、PM2.5、PM1024小时平均浓度对应的IAQI和AQI


空气质量指数计算对照表


计算IAQI函数

DELIMITER $$USE `epdp_lyg`$$DROP FUNCTION IF EXISTS `IAQI_24H`$$CREATE DEFINER=`root`@`%` FUNCTION `IAQI_24H`(param_factor_type VARCHAR(10),param_factor_value DECIMAL(10,5)) RETURNS VARCHAR(32) CHARSET utf8mb4
BEGIN
IF
param_factor_type IS NULL OR  LENGTH(REPLACE(param_factor_type,' ',''))=0
OR param_factor_value IS NULL OR param_factor_value IS NULL
THEN
RETURN NULL;
END IF;
#二氧化硫(SO2)
IF
param_factor_type ="二氧化硫" OR LOWER(param_factor_type) ="so2"
THEN IFparam_factor_value BETWEEN 0 AND 50THENRETURN CEILING((50-0)/(50-0)*(param_factor_value-0)+0);ELSEIFparam_factor_value BETWEEN 50 AND 150THENRETURN CEILING((100-50)/(150-50)*(param_factor_value-50)+50);ELSEIFparam_factor_value BETWEEN 150 AND 475THENRETURN CEILING((150-100)/(475-150)*(param_factor_value-150)+100);ELSEIFparam_factor_value BETWEEN 475 AND 800THENRETURN CEILING((200-150)/(800-475)*(param_factor_value-475)+150);ELSEIFparam_factor_value BETWEEN 800 AND 1600THENRETURN CEILING((300-200)/(1600-800)*(param_factor_value-800)+200);ELSEIFparam_factor_value BETWEEN 1600 AND 2100THENRETURN CEILING((400-300)/(2100-1600)*(param_factor_value-1600)+300);ELSEIFparam_factor_value BETWEEN 2100 AND 2620THENRETURN CEILING((500-400)/(2620-2100)*(param_factor_value-2100)+400);ELSERETURN NULL;   END IF;END IF;#二氧化氮(NO2)
IF
param_factor_type ="二氧化氮" OR LOWER(param_factor_type) ="no2"
THEN IFparam_factor_value BETWEEN 0 AND 40THENRETURN CEILING((50-0)/(40-0)*(param_factor_value-0)+0);ELSEIFparam_factor_value BETWEEN 40 AND 80THENRETURN CEILING((100-50)/(80-40)*(param_factor_value-40)+50);ELSEIFparam_factor_value BETWEEN 80 AND 180THENRETURN CEILING((150-100)/(180-80)*(param_factor_value-80)+100);ELSEIFparam_factor_value BETWEEN 180 AND 280THENRETURN CEILING((200-150)/(280-180)*(param_factor_value-180)+150);ELSEIFparam_factor_value BETWEEN 280 AND 565THENRETURN CEILING((300-200)/(565-280)*(param_factor_value-280)+200);ELSEIFparam_factor_value BETWEEN 565 AND 750THENRETURN CEILING((400-300)/(750-565)*(param_factor_value-565)+300);ELSEIFparam_factor_value BETWEEN 750 AND 940THENRETURN CEILING((500-400)/(940-750)*(param_factor_value-750)+400);ELSERETURN NULL;    END IF;END IF;#一氧化碳(CO)
IF
param_factor_type ="一氧化碳" OR LOWER(param_factor_type) ="co"
THEN IFparam_factor_value BETWEEN 0 AND 2THENRETURN CEILING((50-0)/(2-0)*(param_factor_value-0)+0);ELSEIFparam_factor_value BETWEEN 2 AND 4THENRETURN CEILING((100-50)/(4-2)*(param_factor_value-2)+50);ELSEIFparam_factor_value BETWEEN 4 AND 14THENRETURN CEILING((150-100)/(14-4)*(param_factor_value-4)+100);ELSEIFparam_factor_value BETWEEN 14 AND 24THENRETURN CEILING((200-150)/(24-14)*(param_factor_value-14)+150);ELSEIFparam_factor_value BETWEEN 24 AND 36THENRETURN CEILING((300-200)/(36-24)*(param_factor_value-24)+200);ELSEIFparam_factor_value BETWEEN 36 AND 48THENRETURN CEILING((400-300)/(48-36)*(param_factor_value-36)+300);ELSEIFparam_factor_value BETWEEN 48 AND 60THENRETURN CEILING((500-400)/(60-48)*(param_factor_value-48)+400);ELSERETURN NULL;    END IF;END IF;#臭氧8小时滑动(O38)& 臭氧(O3)
IF
LOWER(param_factor_type) ="o38" OR LOWER(param_factor_type) ="o3"
THEN IFparam_factor_value BETWEEN 0 AND 100THENRETURN CEILING((50-0)/(100-0)*(param_factor_value-0)+0);ELSEIFparam_factor_value BETWEEN 100 AND 160THENRETURN CEILING((100-50)/(160-100)*(param_factor_value-100)+50);ELSEIFparam_factor_value BETWEEN 160 AND 215THENRETURN CEILING((150-100)/(215-160)*(param_factor_value-160)+100);ELSEIFparam_factor_value BETWEEN 215 AND 265THENRETURN CEILING((200-150)/(265-215)*(param_factor_value-215)+150);ELSEIFparam_factor_value BETWEEN 265 AND 800THENRETURN CEILING((300-200)/(800-265)*(param_factor_value-265)+200);ELSE#臭氧高于800,8小时滑动IAQI按照1小时平均浓度计算的分指数报告。RETURN NULL;   END IF;END IF;#PM2.5
IF
LOWER(param_factor_type) ="pm25" OR LOWER(param_factor_type) ="pm2.5"
THEN IFparam_factor_value BETWEEN 0 AND 35THENRETURN CEILING((50-0)/(35-0)*(param_factor_value-0)+0);ELSEIFparam_factor_value BETWEEN 35 AND 75THENRETURN CEILING((100-50)/(75-35)*(param_factor_value-35)+50);ELSEIFparam_factor_value BETWEEN 75 AND 115THENRETURN CEILING((150-100)/(115-75)*(param_factor_value-75)+100);ELSEIFparam_factor_value BETWEEN 115 AND 150THENRETURN CEILING((200-150)/(150-115)*(param_factor_value-115)+150);ELSEIFparam_factor_value BETWEEN 150 AND 250THENRETURN CEILING((300-200)/(250-150)*(param_factor_value-150)+200);ELSEIFparam_factor_value BETWEEN 250 AND 350THENRETURN CEILING((400-300)/(350-250)*(param_factor_value-250)+300);ELSEIFparam_factor_value BETWEEN 350 AND 500THENRETURN CEILING((500-400)/(500-350)*(param_factor_value-350)+400);ELSERETURN NULL;    END IF;END IF;#PM10
IF
LOWER(param_factor_type) ="pm10"
THEN IFparam_factor_value BETWEEN 0 AND 50THENRETURN CEILING((50-0)/(50-0)*(param_factor_value-0)+0);ELSEIFparam_factor_value BETWEEN 50 AND 150THENRETURN CEILING((100-50)/(150-50)*(param_factor_value-50)+50);ELSEIFparam_factor_value BETWEEN 150 AND 250THENRETURN CEILING((150-100)/(250-150)*(param_factor_value-150)+100);ELSEIFparam_factor_value BETWEEN 250 AND 350THENRETURN CEILING((200-150)/(350-250)*(param_factor_value-250)+150);ELSEIFparam_factor_value BETWEEN 350 AND 420THENRETURN CEILING((300-200)/(420-350)*(param_factor_value-350)+200);ELSEIFparam_factor_value BETWEEN 420 AND 500THENRETURN CEILING((400-300)/(500-420)*(param_factor_value-420)+300);ELSEIFparam_factor_value BETWEEN 500 AND 600THENRETURN CEILING((500-400)/(600-500)*(param_factor_value-500)+400);ELSERETURN NULL;   END IF;END IF;END$$DELIMITER ;

调用测试

SELECT
`IAQI_24H`("so2",4.00) so2iaqi,
`IAQI_24H`("no2",30.00) no2iaqi,
`IAQI_24H`("co",0.700) coiaqi,
`IAQI_24H`("o38",119.00) o38iaqi,
`IAQI_24H`("pm25",21.00) pm25iaqi,
`IAQI_24H`("pm10",38.00) pm10iaqi

计算AQI函数

DELIMITER $$USE `数据库名称`$$DROP FUNCTION IF EXISTS `AQI_24H`$$CREATE DEFINER=`数据库登录账号`@`%` FUNCTION `AQI_24H`(
param_so2_value DECIMAL(10,5),
param_no2_value DECIMAL(10,5),
param_co_value DECIMAL(10,5),
param_o38_value DECIMAL(10,5),
param_pm25_value DECIMAL(10,5),
param_pm10_value DECIMAL(10,5)) RETURNS VARCHAR(32) CHARSET utf8mb4
BEGIN
DECLARE so2_iaqi DECIMAL(10,5);
DECLARE no2_iaqi DECIMAL(10,5);
DECLARE co_iaqi DECIMAL(10,5);
DECLARE o38_iaqi DECIMAL(10,5);
DECLARE pm25_iaqi DECIMAL(10,5);
DECLARE pm10_iaqi DECIMAL(10,5);
DECLARE aqi INT(5);#二氧化硫(SO2)IFparam_so2_value BETWEEN 0 AND 50THENSET so2_iaqi = CEILING((50-0)/(50-0)*(param_so2_value-0)+0) ;ELSEIFparam_so2_value BETWEEN 50 AND 150THENSET so2_iaqi = CEILING((100-50)/(150-50)*(param_so2_value-50)+50);ELSEIFparam_so2_value BETWEEN 150 AND 475THENSET so2_iaqi = CEILING((150-100)/(475-150)*(param_so2_value-150)+100);ELSEIFparam_so2_value BETWEEN 475 AND 800THENSET so2_iaqi = CEILING((200-150)/(800-475)*(param_so2_value-475)+150);ELSEIFparam_so2_value BETWEEN 800 AND 1600THENSET so2_iaqi = CEILING((300-200)/(1600-800)*(param_so2_value-800)+200);ELSEIFparam_so2_value BETWEEN 1600 AND 2100THENSET so2_iaqi = CEILING((400-300)/(2100-1600)*(param_so2_value-1600)+300);ELSEIFparam_so2_value BETWEEN 2100 AND 2620THENSET so2_iaqi = CEILING((500-400)/(2620-2100)*(param_so2_value-2100)+400);ELSESET so2_iaqi = NULL;  END IF;#二氧化氮(NO2)IFparam_no2_value BETWEEN 0 AND 40THENSET no2_iaqi = CEILING((50-0)/(40-0)*(param_no2_value-0)+0);ELSEIFparam_no2_value BETWEEN 40 AND 80THENSET no2_iaqi = CEILING((100-50)/(80-40)*(param_no2_value-40)+50);ELSEIFparam_no2_value BETWEEN 80 AND 180THENSET no2_iaqi = CEILING((150-100)/(180-80)*(param_no2_value-80)+100);ELSEIFparam_no2_value BETWEEN 180 AND 280THENSET no2_iaqi = CEILING((200-150)/(280-180)*(param_no2_value-180)+150);ELSEIFparam_no2_value BETWEEN 280 AND 565THENSET no2_iaqi = CEILING((300-200)/(565-280)*(param_no2_value-280)+200);ELSEIFparam_no2_value BETWEEN 565 AND 750THENSET no2_iaqi = CEILING((400-300)/(750-565)*(param_no2_value-565)+300);ELSEIFparam_no2_value BETWEEN 750 AND 940THENSET no2_iaqi = CEILING((500-400)/(940-750)*(param_no2_value-750)+400);ELSESET no2_iaqi = NULL;    END IF;#一氧化碳(CO)IFparam_co_value BETWEEN 0 AND 2THENSET co_iaqi = CEILING((50-0)/(2-0)*(param_co_value-0)+0);ELSEIFparam_co_value BETWEEN 2 AND 4THENSET co_iaqi = CEILING((100-50)/(4-2)*(param_co_value-2)+50);ELSEIFparam_co_value BETWEEN 4 AND 14THENSET co_iaqi = CEILING((150-100)/(14-4)*(param_co_value-4)+100);ELSEIFparam_co_value BETWEEN 14 AND 24THENSET co_iaqi = CEILING((200-150)/(24-14)*(param_co_value-14)+150);ELSEIFparam_co_value BETWEEN 24 AND 36THENSET co_iaqi = CEILING((300-200)/(36-24)*(param_co_value-24)+200);ELSEIFparam_co_value BETWEEN 36 AND 48THENSET co_iaqi = CEILING((400-300)/(48-36)*(param_co_value-36)+300);ELSEIFparam_co_value BETWEEN 48 AND 60THENSET co_iaqi = CEILING((500-400)/(60-48)*(param_co_value-48)+400);ELSESET co_iaqi = NULL;   END IF;
#臭氧8小时滑动(O38)IFparam_o38_value BETWEEN 0 AND 100THENSET o38_iaqi = CEILING((50-0)/(100-0)*(param_o38_value-0)+0);ELSEIFparam_o38_value BETWEEN 100 AND 160THENSET o38_iaqi = CEILING((100-50)/(160-100)*(param_o38_value-100)+50);ELSEIFparam_o38_value BETWEEN 160 AND 215THENSET o38_iaqi = CEILING((150-100)/(215-160)*(param_o38_value-160)+100);ELSEIFparam_o38_value BETWEEN 215 AND 265THENSET o38_iaqi = CEILING((200-150)/(265-215)*(param_o38_value-215)+150);ELSEIFparam_o38_value BETWEEN 265 AND 800THENSET o38_iaqi = CEILING((300-200)/(800-265)*(param_o38_value-265)+200);ELSE#臭氧高于800,8小时滑动IAQI按照1小时平均浓度计算的分指数报告。SET o38_iaqi = NULL; END IF;#PM2.5IFparam_pm25_value BETWEEN 0 AND 35THENSET pm25_iaqi = CEILING((50-0)/(35-0)*(param_pm25_value-0)+0);ELSEIFparam_pm25_value BETWEEN 35 AND 75THENSET pm25_iaqi = CEILING((100-50)/(75-35)*(param_pm25_value-35)+50);ELSEIFparam_pm25_value BETWEEN 75 AND 115THENSET pm25_iaqi = CEILING((150-100)/(115-75)*(param_pm25_value-75)+100);ELSEIFparam_pm25_value BETWEEN 115 AND 150THENSET pm25_iaqi = CEILING((200-150)/(150-115)*(param_pm25_value-115)+150);ELSEIFparam_pm25_value BETWEEN 150 AND 250THENSET pm25_iaqi = CEILING((300-200)/(250-150)*(param_pm25_value-150)+200);ELSEIFparam_pm25_value BETWEEN 250 AND 350THENSET pm25_iaqi = CEILING((400-300)/(350-250)*(param_pm25_value-250)+300);ELSEIFparam_pm25_value BETWEEN 350 AND 500THENSET pm25_iaqi = CEILING((500-400)/(500-350)*(param_pm25_value-350)+400);ELSESET pm25_iaqi = NULL;    END IF;#PM10IFparam_pm10_value BETWEEN 0 AND 50THENSET pm10_iaqi = CEILING((50-0)/(50-0)*(param_pm10_value-0)+0);ELSEIFparam_pm10_value BETWEEN 50 AND 150THENSET pm10_iaqi = CEILING((100-50)/(150-50)*(param_pm10_value-50)+50);ELSEIFparam_pm10_value BETWEEN 150 AND 250THENSET pm10_iaqi = CEILING((150-100)/(250-150)*(param_pm10_value-150)+100);ELSEIFparam_pm10_value BETWEEN 250 AND 350THENSET pm10_iaqi = CEILING((200-150)/(350-250)*(param_pm10_value-250)+150);ELSEIFparam_pm10_value BETWEEN 350 AND 420THENSET pm10_iaqi = CEILING((300-200)/(420-350)*(param_pm10_value-350)+200);ELSEIFparam_pm10_value BETWEEN 420 AND 500THENSET pm10_iaqi = CEILING((400-300)/(500-420)*(param_pm10_value-420)+300);ELSEIFparam_pm10_value BETWEEN 500 AND 600THENSET pm10_iaqi = CEILING((500-400)/(600-500)*(param_pm10_value-500)+400);ELSESET pm10_iaqi = NULL;    END IF;SELECT MAX(iaqi) INTO aqi FROM(
SELECT so2_iaqi iaqi
UNION ALL
SELECT no2_iaqi
UNION ALL
SELECT co_iaqi
UNION ALL
SELECT o38_iaqi
UNION ALL
SELECT pm25_iaqi
UNION ALL
SELECT pm10_iaqi
)a;
RETURN aqi;END$$DELIMITER ;

调用测试

#参数顺序:so2,no2,co,o38,pm25,pm10
SELECT AQI_24H(4.00,30.00,0.700,119.00,21.00,38.00) aqi

MySQL函数计算24小时平均浓度对应的IAQI和AQI相关推荐

  1. 计算机公式求时间差公式,24时间差计算公式 excel中计算24小时

    excel中计算24小时制时间差 怎样在excel中计算24小时制时间差,在一天之内的小编会,不过不在一天之内外套一个MOD函数,就行了,这样试试 =MOD("0:36"-&quo ...

  2. mysql 查询最近24小时,mysql中怎么查询最近24小时、昨天、最近7天、下周、最近30天、下月的数据...

    mysql中如何查询最近24小时.昨天.最近7天.上周.最近30天.上月的数据 在数据表中使用date列保存yyyy.MM.dd HH:MM:SS格式的时间记录,mysql中如何查询最近24小时.昨天 ...

  3. Mysql 查询前24小时、3条离当前时间最近的记录

    Mysql 查询以当前时间往后的24小时内的数据  register_date >=(NOW() - interval 24 hour) 例如: select * from sys_user W ...

  4. java计算24小时之内_java的系统时间,怎么计算从现在到凌晨还剩下多少时间?

    Apache commons-lang3 long milliSecondsLeftToday = 86400000 -DateUtils.getFragmentInMilliseconds(Cale ...

  5. mysql geo_地理位置geo处理之mysql函数

    目前越来越多的业务都会基于LBS,附近的人,外卖位置,附近商家等等,现就讨论离我最近这一业务场景的解决方案. 原文:https://www.jianshu.com/p/455d0468f6d4 目前已 ...

  6. mysql geo_地理位置geo处理之mysql函数的详细介绍(附代码)

    本篇文章给大家带来的内容是关于地理位置geo处理之mysql函数的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 目前越来越多的业务都会基于LBS,附近的人,外卖位 ...

  7. python根据excel时间表统计24小时各小时区间点的个数

    1.首先使用excel中的HOUR()函数,将日期数据(年/月/日 时:分:秒)转换为小时,表格命名为hour.xlsx: 2.使用python读取excel数据hour.xlsx,将小时列转换为列表 ...

  8. mysql geo 函数_地理位置geo处理之mysql函数

    目前越来越多的业务都会基于LBS,附近的人,外卖位置,附近商家等等,现就讨论离我最近这一业务场景的解决方案. 原文:https://www.jianshu.com/p/455d0468f6d4 目前已 ...

  9. mysql geo 函数_【后端开发】地理位置geo处理之mysql函数的详细介绍(附代码)

    本篇文章给大家带来的内容是关于地理位置geo处理之mysql函数的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 目前越来越多的业务都会基于LBS,附近的人,外卖位 ...

最新文章

  1. 独家 | 你的神经网络不起作用的37个理由(附链接)
  2. 应届生web前端面试题_2020最新Web前端经典面试题试题及答案(持续更新)
  3. python无穷大整数_python的特殊数字类型(无穷大、无穷小等)
  4. 2020 蓝桥杯大学 B 组省赛模拟赛(一) C. 结果填空:七巧板
  5. 创建面板对象Java,从PNG图像或Java面板创建PDF
  6. 漫画:什么是计数排序
  7. 可以让你少奋斗十年的工作经验
  8. Docker安装FireBird数据库
  9. 当科学家们使用计算机来试图,当科学家们使用计算机来试图预测复杂的--易哈佛考试题库...
  10. pycharm 服务器证书错误,pycharm 如何跳出服务器证书不受信任的提示
  11. DolphinPHP(海豚PHP)实战教程
  12. Python专栏 | ICA应用:如何识别伪影信号?(一)
  13. SEO网站内容优化的6点干货分享分享-飞鱼SEO
  14. 【Oracle】ngrok 映射数据库地址为外网
  15. 吉林大学软件学院黄庆道《最优化算法》对偶单纯形使用大M法条件
  16. UVALive 6657 GCD XOR
  17. windwos服务器网站504,打开网站出现504 gateway time-out的原因及解决方法
  18. 精彩回顾 | Dev.Together 2022 开发者生态峰会圆满落幕
  19. 运行无法打开计算机策略,“组策略不能打开”的解决方案
  20. PNP与NPN两种三极管使用方法

热门文章

  1. 利用python实现m4a格式到MP3的转换
  2. C#工作总结(一):Fleck的WebSocket使用
  3. 微信html5开发常见bug,微信公众号H5之微信分享常见错误和问题
  4. java毕业生设计宠物医院管理计算机源码+系统+mysql+调试部署+lw
  5. SQL语句中计算百分比
  6. cad2012打开后闪退_2012cad闪退怎么解决win10_cad2012闪退win10系统如何修复
  7. java数组实现 多个数字求最大公约数
  8. 练习三 HTML5 logo
  9. Linux下的LVM逻辑卷管理
  10. Win10怎么关闭屏幕保护?Windows10禁用屏保步骤