Sfoglia il codice sorgente

Merge branch 'classwork/140225'

Vsevolod Levitan 2 mesi fa
parent
commit
f20e2d9a51
2 ha cambiato i file con 64 aggiunte e 0 eliminazioni
  1. 62 0
      homework/3.class.sql
  2. 2 0
      homework/3.class.test.sql

+ 62 - 0
homework/3.class.sql

@@ -0,0 +1,62 @@
+-- Функция формата даты
+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;
+$$;

+ 2 - 0
homework/3.class.test.sql

@@ -0,0 +1,2 @@
+-- Проверка фукнции добавленной на паре
+select approx_report(now(), 60::numeric, 743::numeric, 23::numeric);