12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- create table if not exists numeric_constants(key varchar primary key, value numeric);
- -- Функция формата даты
- create or replace function approx_report_date(t_date timestamptz)
- returns varchar(5)
- language plpgsql
- as
- $$
- begin
- return lpad(extract(day from t_date)::text, 2, '0') || lpad(extract(hour from t_date)::text, 2, '0') || floor((extract(minute from t_date) / 10))::varchar;
- end;
- $$;
- -- Функция формата высоты
- create or replace function approx_report_height(height numeric)
- returns varchar(4)
- language plpgsql
- as
- $$
- begin
- return lpad(height::text, 4, '0');
- end;
- $$;
- -- Функция формата отклонения по давлению и температуре
- create or replace function approx_report_deviation(pressure numeric, temperature numeric)
- returns varchar(5)
- language plpgsql
- as
- $$
- declare
- pressure_dev numeric;
- temperature_dev numeric;
- res varchar(5);
- begin
- pressure_dev = (pressure - (select value from numeric_constants where key = 'rel_pressure'));
- temperature_dev = (temperature - (select value from numeric_constants where key = 'rel_temperature'));
- temperature_dev := round(temperature_dev + calc_adjustment(calc_interpolation(temperature)));
-
- res = case when pressure_dev >= 0 then pressure_dev::text else ('5' || lpad((pressure_dev*-1)::text, 2, '0')) end;
- res = concat(res, lpad(temperature_dev::text, 2, '0'));
-
- return res;
- end;
- $$;
- -- Тип приблизительного отчета
- CREATE TYPE approx_report AS
- (
- date character varying(5),
- height character varying(4),
- deviation character varying(5)
- );
- -- Функция получения приблизительного отчета
- create or replace function approx_report(date timestamptz, height numeric, pressure numeric, temperature numeric)
- returns approx_report
- language plpgsql
- as
- $$
- begin
- return (approx_report_date(date)::varchar(5), approx_report_height(height)::varchar(4), approx_report_deviation(pressure, temperature)::varchar(5)) as approx_report;
- end;
- $$;
- insert into numeric_constants(key, value) values ('rel_pressure', 750);
- insert into numeric_constants(key, value) values ('rel_temperature', 15.9);
|