Ver código fonte

添加初始化脚本

xiaoguohua 2 meses atrás
pai
commit
7fc4b58035
1 arquivos alterados com 147 adições e 0 exclusões
  1. 147 0
      doc/数据库脚本/gateway-data-sample.sql

+ 147 - 0
doc/数据库脚本/gateway-data-sample.sql

@@ -0,0 +1,147 @@
+-- ============================================================
+-- 脚本名称: 插入气象数据测试数据
+-- 功能: 向 data_weather_local 表中插入指定时间范围的测试数据
+-- 数据精度: 5分钟
+-- 参数说明:
+--   - start_time: 开始时间 (格式: 'YYYY-MM-DD HH:MI:SS' 或 'YYYY-MM-DD')
+--   - end_time: 结束时间 (格式: 'YYYY-MM-DD HH:MI:SS' 或 'YYYY-MM-DD')
+--   - station_id: 场站ID (默认: 1)
+-- ============================================================
+
+DO $$
+DECLARE
+    -- ========== 可配置参数 ==========
+v_start_time TIMESTAMPTZ := '2026-08-05 00:00:00';  -- 开始时间
+    v_end_time   TIMESTAMPTZ := '2026-08-06 00:00:00';  -- 结束时间(不包含)
+    v_station_id BIGINT      := 1;                       -- 场站ID
+    -- ================================
+
+    v_current_time TIMESTAMPTZ;
+    v_hour_of_day  INTEGER;
+    v_day_of_year  INTEGER;
+    v_base_value   DOUBLE PRECISION;
+    v_random_factor DOUBLE PRECISION;
+
+    -- 各字段的合理范围
+    v_irradiance_max DOUBLE PRECISION := 1200;  -- 最大辐照度 W/m²
+    v_temp_min       DOUBLE PRECISION := -20;   -- 最低温度 ℃
+    v_temp_max       DOUBLE PRECISION := 45;    -- 最高温度 ℃
+    v_pressure_min   DOUBLE PRECISION := 950;   -- 最低气压 hPa
+    v_pressure_max   DOUBLE PRECISION := 1060;  -- 最高气压 hPa
+    v_humidity_min   DOUBLE PRECISION := 10;    -- 最低湿度 %
+    v_humidity_max   DOUBLE PRECISION := 100;   -- 最高湿度 %
+    v_wind_speed_max DOUBLE PRECISION := 25;    -- 最大风速 m/s
+
+    v_counter INTEGER := 0;
+
+    -- 声明变量用于存储计算值
+    v_horizontal_irradiance DOUBLE PRECISION;
+    v_inclined_irradiance   DOUBLE PRECISION;
+    v_temperature           DOUBLE PRECISION;
+    v_pressure              DOUBLE PRECISION;
+    v_humidity              DOUBLE PRECISION;
+    v_wind_speed            DOUBLE PRECISION;
+    v_wind_direction        DOUBLE PRECISION;
+BEGIN
+    -- 参数验证
+    IF v_start_time >= v_end_time THEN
+        RAISE EXCEPTION '开始时间必须早于结束时间';
+END IF;
+
+    -- 如果结束时间超过当前时间,发出警告
+    IF v_end_time > NOW() THEN
+        RAISE WARNING '结束时间 (%) 晚于当前时间,将插入未来数据', v_end_time;
+END IF;
+
+    -- 初始化当前时间为开始时间
+    v_current_time := v_start_time;
+
+    RAISE NOTICE '开始插入数据: 场站ID=%, 时间范围: % 至 %',
+                  v_station_id, v_start_time, v_end_time;
+
+    -- 循环插入数据,步长5分钟
+    WHILE v_current_time < v_end_time LOOP
+        -- 计算时间相关因子(用于模拟日变化规律)
+        v_hour_of_day := EXTRACT(HOUR FROM v_current_time) * 60 + EXTRACT(MINUTE FROM v_current_time);
+        v_day_of_year := EXTRACT(DOY FROM v_current_time);
+
+        -- 模拟辐照度的日变化(正弦曲线,夜间为0)
+        -- 峰值在正午12:00 (720分钟),范围 0-1200 W/m²
+        IF v_hour_of_day >= 300 AND v_hour_of_day <= 1140 THEN  -- 5:00 到 19:00
+            v_base_value := SIN((v_hour_of_day - 300) * PI() / 840) * v_irradiance_max;
+ELSE
+            v_base_value := 0;
+END IF;
+
+        -- 添加随机波动 (±15%)
+        v_random_factor := 0.85 + (random() * 0.30);
+        v_horizontal_irradiance := v_base_value * v_random_factor;
+
+        -- 斜面辐照度:水平辐照度的 0.8-1.2 倍
+        v_inclined_irradiance := v_horizontal_irradiance * (0.8 + random() * 0.4);
+
+        -- 温度:日变化,夜间低白天高,范围 -20~45℃
+        -- 最低温在凌晨4点,最高温在下午14点
+        v_base_value := COS((v_hour_of_day - 240) * PI() / 720) * 15;
+        v_temperature := 15 + v_base_value + (random() - 0.5) * 6;
+        -- 限制范围
+        v_temperature := GREATEST(v_temp_min, LEAST(v_temp_max, v_temperature));
+
+        -- 气压:950-1060 hPa,缓慢随机变化
+        v_pressure := 1013 + (SIN(v_day_of_year * 0.02) * 20) + (random() - 0.5) * 15;
+        v_pressure := GREATEST(v_pressure_min, LEAST(v_pressure_max, v_pressure));
+
+        -- 湿度:10-100%,与温度有一定负相关
+        v_humidity := 70 - (v_temperature - 15) * 1.0 + (random() - 0.5) * 20;
+        v_humidity := GREATEST(v_humidity_min, LEAST(v_humidity_max, v_humidity));
+
+        -- 风速:0-25 m/s,随机变化
+        v_wind_speed := random() * v_wind_speed_max;
+
+        -- 风向:0-360度,随机
+        v_wind_direction := random() * 360;
+
+        -- 插入数据
+INSERT INTO data_weather_local (
+    tm,
+    config_station_id,
+    horizontal_irradiance,
+    inclined_irradiance,
+    temperature,
+    pressure,
+    humidity,
+    wind_speed,
+    wind_direction
+) VALUES (
+             v_current_time,
+             v_station_id,
+             ROUND(v_horizontal_irradiance::NUMERIC, 2),
+             ROUND(v_inclined_irradiance::NUMERIC, 2),
+             ROUND(v_temperature::NUMERIC, 2),
+             ROUND(v_pressure::NUMERIC, 2),
+             ROUND(v_humidity::NUMERIC, 2),
+             ROUND(v_wind_speed::NUMERIC, 2),
+             ROUND(v_wind_direction::NUMERIC, 2)
+         );
+
+v_counter := v_counter + 1;
+
+        -- 每1000条输出一次进度
+        IF v_counter % 1000 = 0 THEN
+            RAISE NOTICE '已插入 % 条数据,当前时间: %', v_counter, v_current_time;
+END IF;
+
+        -- 时间增加5分钟
+        v_current_time := v_current_time + INTERVAL '5 minutes';
+END LOOP;
+
+    RAISE NOTICE '数据插入完成!共插入 % 条数据', v_counter;
+
+    -- 显示插入数据统计
+    RAISE NOTICE '数据统计:';
+    RAISE NOTICE '  - 总记录数: %', v_counter;
+    RAISE NOTICE '  - 开始时间: %', v_start_time;
+    RAISE NOTICE '  - 结束时间: %', v_end_time;
+    RAISE NOTICE '  - 场站ID: %', v_station_id;
+
+END $$;