mock_data_electricity_local.sql 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. -- ============================================================
  2. -- 脚本功能:独立生成光伏电站实测数据 (data_electricity_local)
  3. -- 修正说明:
  4. -- 1. 彻底修复所有 ROUND 函数的类型问题。
  5. -- 2. 所有涉及浮点运算的结果均显式转换为 NUMERIC。
  6. -- ============================================================
  7. DO $$
  8. DECLARE
  9. -- ================= 配置区域 =================
  10. v_past_days INTEGER := 30; -- 从过去多少天开始
  11. v_future_days INTEGER := 10; -- 到未来多少天结束
  12. v_interval_minutes INTEGER := 15; -- 数据间隔(分钟)
  13. -- 模拟场站配置
  14. v_station_id BIGINT := 2; -- 光伏场站ID
  15. v_max_power NUMERIC := 100.0; -- 理论最大发电功率(装机容量 kW)
  16. -- 循环变量
  17. v_start_timestamp TIMESTAMP WITH TIME ZONE;
  18. v_end_timestamp TIMESTAMP WITH TIME ZONE;
  19. v_current_time TIMESTAMP WITH TIME ZONE;
  20. -- 计算变量
  21. v_hour_of_day NUMERIC;
  22. v_solar_noon NUMERIC := 12.5; -- 正午时间(12:30左右)
  23. v_sunshine_hours NUMERIC := 11.0; -- 日照时长(假设值)
  24. -- 最终插入的字段值
  25. v_theoretical_power NUMERIC;
  26. v_actual_power NUMERIC;
  27. v_curtailment_power NUMERIC;
  28. v_device_status SMALLINT;
  29. v_availability NUMERIC;
  30. v_grid_status SMALLINT;
  31. BEGIN
  32. RAISE NOTICE '开始生成光伏实测数据。场站ID: %', v_station_id;
  33. -- 1. 计算时间范围
  34. v_start_timestamp := (CURRENT_DATE - INTERVAL '1 day' * v_past_days) AT TIME ZONE 'Asia/Shanghai';
  35. v_end_timestamp := (CURRENT_DATE + INTERVAL '1 day' * v_future_days) AT TIME ZONE 'Asia/Shanghai';
  36. v_current_time := v_start_timestamp;
  37. -- 2. 清理旧数据
  38. DELETE FROM public.data_electricity_local
  39. WHERE config_station_id = v_station_id
  40. AND tm >= v_start_timestamp
  41. AND tm <= v_end_timestamp;
  42. -- 3. 循环生成数据
  43. WHILE v_current_time <= v_end_timestamp LOOP
  44. -- 获取小时数(带小数,例如 13.25 代表 13:15)
  45. v_hour_of_day := EXTRACT(HOUR FROM v_current_time) + EXTRACT(MINUTE FROM v_current_time) / 60.0;
  46. -- ================= 核心算法:模拟光伏出力 =================
  47. IF v_hour_of_day BETWEEN (v_solar_noon - v_sunshine_hours/2) AND (v_solar_noon + v_sunshine_hours/2) THEN
  48. -- 计算正弦值
  49. DECLARE
  50. v_day_factor NUMERIC;
  51. BEGIN
  52. v_day_factor := (v_hour_of_day - (v_solar_noon - v_sunshine_hours/2)) / v_sunshine_hours;
  53. -- 修正点:将 SIN 的结果转换为 NUMERIC
  54. v_theoretical_power := v_max_power * SIN(PI() * v_day_factor)::NUMERIC;
  55. -- 增加随机波动(修正点:将 RANDOM() 结果转换为 NUMERIC)
  56. v_theoretical_power := v_theoretical_power * (0.95::NUMERIC + RANDOM()::NUMERIC * 0.1::NUMERIC);
  57. v_theoretical_power := ROUND(v_theoretical_power, 2);
  58. END;
  59. ELSE
  60. v_theoretical_power := 0;
  61. END IF;
  62. -- ================= 衍生字段逻辑 =================
  63. -- 1. 实际功率(修正点:显式转换)
  64. v_actual_power := ROUND(v_theoretical_power * 0.98::NUMERIC, 2);
  65. -- 2. 限电功率与设备状态(修正点:显式转换)
  66. IF RANDOM() > 0.95 AND v_actual_power > 10 THEN
  67. v_curtailment_power := ROUND(v_actual_power * (0.1::NUMERIC + RANDOM()::NUMERIC * 0.2::NUMERIC), 2);
  68. v_actual_power := v_actual_power - v_curtailment_power;
  69. v_device_status := 2; -- 限电
  70. ELSE
  71. v_curtailment_power := 0;
  72. v_device_status := 0; -- 正常
  73. END IF;
  74. -- 夜间停机
  75. IF v_theoretical_power = 0 THEN
  76. v_device_status := 1;
  77. END IF;
  78. -- 3. 并网状态
  79. IF v_actual_power > 0 OR (v_hour_of_day BETWEEN 6 AND 19) THEN
  80. v_grid_status := 1;
  81. ELSE
  82. v_grid_status := 0;
  83. END IF;
  84. -- 4. 可用率
  85. v_availability := 100.0;
  86. IF v_device_status = 1 THEN v_availability := 0; END IF;
  87. IF v_device_status = 2 THEN v_availability := 90; END IF;
  88. -- 5. 插入数据
  89. INSERT INTO public.data_electricity_local (
  90. tm,
  91. config_station_id,
  92. actual_power,
  93. theoretical_power,
  94. curtailment_power,
  95. availability,
  96. device_status,
  97. grid_status
  98. ) VALUES (
  99. v_current_time,
  100. v_station_id,
  101. v_actual_power,
  102. v_theoretical_power,
  103. v_curtailment_power,
  104. v_availability,
  105. v_device_status,
  106. v_grid_status
  107. );
  108. -- 移动到下一个时间点
  109. v_current_time := v_current_time + INTERVAL '1 minute' * v_interval_minutes;
  110. END LOOP;
  111. RAISE NOTICE '光伏实测数据生成完成!范围: % 到 %', v_start_timestamp, v_end_timestamp;
  112. END $$;