-- added
select define_function_args('timezone__add_rule','tz,abbrev,isdst_p,gmt_offset,utc_start,utc_end,local_start,local_end');
--
-- procedure timezone__add_rule/8
--
CREATE OR REPLACE FUNCTION timezone__add_rule(
p_tz varchar,
p_abbrev varchar,
p_isdst_p integer,
p_gmt_offset varchar,
p_utc_start varchar,
p_utc_end varchar,
p_local_start varchar,
p_local_end varchar
) RETURNS integer AS $$
DECLARE
BEGIN
insert into timezone_rules
(tz_id, abbrev, utc_start, utc_end, local_start, local_end, gmt_offset, isdst_p)
select timezone__get_id(p_tz), p_abbrev, rdbms_date(p_utc_start),
rdbms_date(p_utc_end), rdbms_date(p_local_start),
to_date(p_local_end),
p_gmt_offset,
case p_isdst_p when 0 then 'f' else 't'end;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('timezone__convert_to_local','tz_id,utc_varchar');
--
-- procedure timezone__convert_to_local/2
--
CREATE OR REPLACE FUNCTION timezone__convert_to_local(
p_tz_id integer,
p_utc_varchar varchar
) RETURNS timestamptz AS $$
DECLARE
v_base_time timestamptz;
BEGIN
select "timestamptz" (p_utc_varchar || substr(gmt_offset,1,5)) into v_base_time
from timezones
where tz_id = p_tz_id;
if not found then
return "timestamptz" (p_utc_varchar || '+00');
end if;
return "timestamptz" (p_utc_varchar) + "interval" (gmt_offset || 'seconds')
from timezone_rules
where tz_id = p_tz_id and v_base_time between utc_start and utc_end;
END;
$$ LANGUAGE plpgsql stable;
-- added
select define_function_args('timezone__convert_to_utc','tz_id,local_varchar');
--
-- procedure timezone__convert_to_utc/2
--
CREATE OR REPLACE FUNCTION timezone__convert_to_utc(
p_tz_id integer,
p_local_varchar varchar
) RETURNS timestamptz AS $$
DECLARE
v_base_time timestamptz;
BEGIN
select "timestamptz" (p_local_varchar || substr(gmt_offset,1,5)) into v_base_time
from timezones
where tz_id = p_tz_id;
if not found then
return "timestamptz" (p_local_varchar || '+00');
end if;
return "timestamptz" (p_local_varchar) - "interval" (gmt_offset || 'seconds')
from timezone_rules
where tz_id = p_tz_id and v_base_time between utc_start and utc_end;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('timezone__delete','tz_id');
--
-- procedure timezone__delete/1
--
CREATE OR REPLACE FUNCTION timezone__delete(
p_tz_id integer
) RETURNS integer AS $$
DECLARE
BEGIN
delete from timezone_rules where tz_id = p_tz_id;
delete from timezones where tz_id = p_tz_id;
return 0;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('timezone__get_abbrev','tz_id,time');
--
-- procedure timezone__get_abbrev/2
--
CREATE OR REPLACE FUNCTION timezone__get_abbrev(
p_tz_id integer,
p_time timestamptz
) RETURNS varchar AS $$
DECLARE
v_abbrev timezone_rules.abbrev%TYPE;
BEGIN
v_abbrev := 'GMT';
select abbrev into v_abbrev
from timezone_rules
where tz_id = p_tz_id and p_time between local_start and local_end;
return v_abbrev;
END;
$$ LANGUAGE plpgsql stable;
-- added
select define_function_args('timezone__get_date','tz_id,timestamp,format,append_timezone_p');
--
-- procedure timezone__get_date/4
--
CREATE OR REPLACE FUNCTION timezone__get_date(
p_tz_id integer,
p_timestamp timestamptz,
p_format varchar,
p_append_timezone_p boolean
) RETURNS varchar AS $$
DECLARE
v_timestamp timestamptz;
v_abbrev text;
v_date text;
BEGIN
v_abbrev := '';
if p_append_timezone_p then
select abbrev into v_abbrev
from timezone_rules
where tz_id = p_tz_id and p_timestamp between utc_start and utc_end;
end if;
select to_char(p_timestamp + "interval" (
(extract(timezone_hour from p_timestamp) * 3600 + extract(timezone_minute from p_timestamp) * 60) || 'seconds') +
"interval" (gmt_offset || 'seconds'), p_format) || ' ' || v_abbrev
into v_date
from timezone_rules
where tz_id = p_tz_id and p_timestamp between utc_start and utc_end;
if not found then
select to_char(p_timestamp + "interval" ((extract(timezone_hour from p_timestamp) * 3600 + extract(timezone_minute from p_timestamp) * 60) || 'seconds'), p_format)
into v_date;
end if;
return v_date;
END;
$$ LANGUAGE plpgsql stable;
-- added
select define_function_args('timezone__get_id','tz');
--
-- procedure timezone__get_id/1
--
CREATE OR REPLACE FUNCTION timezone__get_id(
p_tz varchar
) RETURNS integer AS $$
DECLARE
v_tz_id integer;
BEGIN
return tz_id
from timezones
where tz = p_tz;
END;
$$ LANGUAGE plpgsql stable strict;
-- added
select define_function_args('timezone__get_offset','tz_id,time');
--
-- procedure timezone__get_offset/2
--
CREATE OR REPLACE FUNCTION timezone__get_offset(
p_tz_id integer,
p_time timestamptz
) RETURNS interval AS $$
DECLARE
v_offset integer;
BEGIN
v_offset := '0';
select gmt_offset into v_offset
from timezone_rules
where tz_id = p_tz_id and p_time between utc_start and utc_end;
return "interval" (v_offset || 'seconds');
END;
$$ LANGUAGE plpgsql stable;
-- added
select define_function_args('timezone__get_rawoffset','tz_id,time');
--
-- procedure timezone__get_rawoffset/2
--
CREATE OR REPLACE FUNCTION timezone__get_rawoffset(
p_tz_id integer,
p_time timestamptz
) RETURNS interval AS $$
DECLARE
v_offset varchar;
BEGIN
v_offset := '0';
select
case isdst_p
when 't' then "interval" (gmt_offset || 'seconds') - '3600 seconds'
else "interval" (gmt_offset || 'seconds')
end
into v_offset
from timezone_rules
where tz_id = p_tz_id and p_time between utc_start and utc_end;
return v_offset;
END;
$$ LANGUAGE plpgsql stable;
-- added
select define_function_args('timezone__isdst_p','tz_id,time');
--
-- procedure timezone__isdst_p/2
--
CREATE OR REPLACE FUNCTION timezone__isdst_p(
p_tz_id integer,
p_time timestamptz
) RETURNS boolean AS $$
DECLARE
v_isdst_p boolean;
BEGIN
v_isdst_p := 'f';
select isdst_p into v_isdst_p
from timezone_rules
where tz_id = p_tz_id and p_time between local_start and local_end;
return v_isdst_p;
END;
$$ LANGUAGE plpgsql stable;
-- added
select define_function_args('timezone__new','tz,gmt_offset');
--
-- procedure timezone__new/2
--
CREATE OR REPLACE FUNCTION timezone__new(
p_tz varchar,
p_gmt_offset varchar
) RETURNS integer AS $$
DECLARE
BEGIN
insert into timezones
(tz_id, tz, gmt_offset)
values
(nextval('timezone_seq'), p_tz, gmt_offset);
return 0;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('rdbms_date','raw_date');
--
-- procedure rdbms_date/1
--
CREATE OR REPLACE FUNCTION rdbms_date(
p_raw_date varchar
) RETURNS timestamptz AS $$
DECLARE
BEGIN
return "timestamptz" (p_raw_date || '+00');
END;
$$ LANGUAGE plpgsql stable strict;