gateway-data-sample.sql 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. -- ============================================================
  2. -- 脚本名称: 插入气象数据测试数据
  3. -- 功能: 向 data_weather_local 表中插入指定时间范围的测试数据
  4. -- 数据精度: 5分钟
  5. -- 参数说明:
  6. -- - start_time: 开始时间 (格式: 'YYYY-MM-DD HH:MI:SS' 或 'YYYY-MM-DD')
  7. -- - end_time: 结束时间 (格式: 'YYYY-MM-DD HH:MI:SS' 或 'YYYY-MM-DD')
  8. -- - station_id: 场站ID (默认: 1)
  9. -- ============================================================
  10. DO $$
  11. DECLARE
  12. -- ========== 可配置参数 ==========
  13. v_start_time TIMESTAMPTZ := '2026-08-05 00:00:00'; -- 开始时间
  14. v_end_time TIMESTAMPTZ := '2026-08-06 00:00:00'; -- 结束时间(不包含)
  15. v_station_id BIGINT := 1; -- 场站ID
  16. -- ================================
  17. v_current_time TIMESTAMPTZ;
  18. v_hour_of_day INTEGER;
  19. v_day_of_year INTEGER;
  20. v_base_value DOUBLE PRECISION;
  21. v_random_factor DOUBLE PRECISION;
  22. -- 各字段的合理范围
  23. v_irradiance_max DOUBLE PRECISION := 1200; -- 最大辐照度 W/m²
  24. v_temp_min DOUBLE PRECISION := -20; -- 最低温度 ℃
  25. v_temp_max DOUBLE PRECISION := 45; -- 最高温度 ℃
  26. v_pressure_min DOUBLE PRECISION := 950; -- 最低气压 hPa
  27. v_pressure_max DOUBLE PRECISION := 1060; -- 最高气压 hPa
  28. v_humidity_min DOUBLE PRECISION := 10; -- 最低湿度 %
  29. v_humidity_max DOUBLE PRECISION := 100; -- 最高湿度 %
  30. v_wind_speed_max DOUBLE PRECISION := 25; -- 最大风速 m/s
  31. v_counter INTEGER := 0;
  32. -- 声明变量用于存储计算值
  33. v_horizontal_irradiance DOUBLE PRECISION;
  34. v_inclined_irradiance DOUBLE PRECISION;
  35. v_temperature DOUBLE PRECISION;
  36. v_pressure DOUBLE PRECISION;
  37. v_humidity DOUBLE PRECISION;
  38. v_wind_speed DOUBLE PRECISION;
  39. v_wind_direction DOUBLE PRECISION;
  40. BEGIN
  41. -- 参数验证
  42. IF v_start_time >= v_end_time THEN
  43. RAISE EXCEPTION '开始时间必须早于结束时间';
  44. END IF;
  45. -- 如果结束时间超过当前时间,发出警告
  46. IF v_end_time > NOW() THEN
  47. RAISE WARNING '结束时间 (%) 晚于当前时间,将插入未来数据', v_end_time;
  48. END IF;
  49. -- 初始化当前时间为开始时间
  50. v_current_time := v_start_time;
  51. RAISE NOTICE '开始插入数据: 场站ID=%, 时间范围: % 至 %',
  52. v_station_id, v_start_time, v_end_time;
  53. -- 循环插入数据,步长5分钟
  54. WHILE v_current_time < v_end_time LOOP
  55. -- 计算时间相关因子(用于模拟日变化规律)
  56. v_hour_of_day := EXTRACT(HOUR FROM v_current_time) * 60 + EXTRACT(MINUTE FROM v_current_time);
  57. v_day_of_year := EXTRACT(DOY FROM v_current_time);
  58. -- 模拟辐照度的日变化(正弦曲线,夜间为0)
  59. -- 峰值在正午12:00 (720分钟),范围 0-1200 W/m²
  60. IF v_hour_of_day >= 300 AND v_hour_of_day <= 1140 THEN -- 5:00 到 19:00
  61. v_base_value := SIN((v_hour_of_day - 300) * PI() / 840) * v_irradiance_max;
  62. ELSE
  63. v_base_value := 0;
  64. END IF;
  65. -- 添加随机波动 (±15%)
  66. v_random_factor := 0.85 + (random() * 0.30);
  67. v_horizontal_irradiance := v_base_value * v_random_factor;
  68. -- 斜面辐照度:水平辐照度的 0.8-1.2 倍
  69. v_inclined_irradiance := v_horizontal_irradiance * (0.8 + random() * 0.4);
  70. -- 温度:日变化,夜间低白天高,范围 -20~45℃
  71. -- 最低温在凌晨4点,最高温在下午14点
  72. v_base_value := COS((v_hour_of_day - 240) * PI() / 720) * 15;
  73. v_temperature := 15 + v_base_value + (random() - 0.5) * 6;
  74. -- 限制范围
  75. v_temperature := GREATEST(v_temp_min, LEAST(v_temp_max, v_temperature));
  76. -- 气压:950-1060 hPa,缓慢随机变化
  77. v_pressure := 1013 + (SIN(v_day_of_year * 0.02) * 20) + (random() - 0.5) * 15;
  78. v_pressure := GREATEST(v_pressure_min, LEAST(v_pressure_max, v_pressure));
  79. -- 湿度:10-100%,与温度有一定负相关
  80. v_humidity := 70 - (v_temperature - 15) * 1.0 + (random() - 0.5) * 20;
  81. v_humidity := GREATEST(v_humidity_min, LEAST(v_humidity_max, v_humidity));
  82. -- 风速:0-25 m/s,随机变化
  83. v_wind_speed := random() * v_wind_speed_max;
  84. -- 风向:0-360度,随机
  85. v_wind_direction := random() * 360;
  86. -- 插入数据
  87. INSERT INTO data_weather_local (
  88. tm,
  89. config_station_id,
  90. horizontal_irradiance,
  91. inclined_irradiance,
  92. temperature,
  93. pressure,
  94. humidity,
  95. wind_speed,
  96. wind_direction
  97. ) VALUES (
  98. v_current_time,
  99. v_station_id,
  100. ROUND(v_horizontal_irradiance::NUMERIC, 2),
  101. ROUND(v_inclined_irradiance::NUMERIC, 2),
  102. ROUND(v_temperature::NUMERIC, 2),
  103. ROUND(v_pressure::NUMERIC, 2),
  104. ROUND(v_humidity::NUMERIC, 2),
  105. ROUND(v_wind_speed::NUMERIC, 2),
  106. ROUND(v_wind_direction::NUMERIC, 2)
  107. );
  108. v_counter := v_counter + 1;
  109. -- 每1000条输出一次进度
  110. IF v_counter % 1000 = 0 THEN
  111. RAISE NOTICE '已插入 % 条数据,当前时间: %', v_counter, v_current_time;
  112. END IF;
  113. -- 时间增加5分钟
  114. v_current_time := v_current_time + INTERVAL '5 minutes';
  115. END LOOP;
  116. RAISE NOTICE '数据插入完成!共插入 % 条数据', v_counter;
  117. -- 显示插入数据统计
  118. RAISE NOTICE '数据统计:';
  119. RAISE NOTICE ' - 总记录数: %', v_counter;
  120. RAISE NOTICE ' - 开始时间: %', v_start_time;
  121. RAISE NOTICE ' - 结束时间: %', v_end_time;
  122. RAISE NOTICE ' - 场站ID: %', v_station_id;
  123. END $$;