164 lines
4.9 KiB
MySQL
164 lines
4.9 KiB
MySQL
|
|
-- (Optional): set the search_path so all functions are generated on the mimiciii schema
|
||
|
|
-- SET search_path TO mimiciii;
|
||
|
|
|
||
|
|
CREATE OR REPLACE FUNCTION REGEXP_EXTRACT(str TEXT, pattern TEXT) RETURNS TEXT AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN substring(str from pattern);
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
CREATE OR REPLACE FUNCTION REGEXP_CONTAINS(str TEXT, pattern TEXT) RETURNS BOOL AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN str ~ pattern;
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
-- alias generate_series with generate_array
|
||
|
|
CREATE OR REPLACE FUNCTION GENERATE_ARRAY(i INTEGER, j INTEGER)
|
||
|
|
RETURNS setof INTEGER language sql as $$
|
||
|
|
SELECT GENERATE_SERIES(i, j)
|
||
|
|
$$;
|
||
|
|
|
||
|
|
-- datetime functions
|
||
|
|
CREATE OR REPLACE FUNCTION DATETIME(dt DATE) RETURNS TIMESTAMP(3) AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN CAST(dt AS TIMESTAMP(3));
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
CREATE OR REPLACE FUNCTION DATETIME(year INTEGER, month INTEGER, day INTEGER, hour INTEGER, minute INTEGER, second INTEGER) RETURNS TIMESTAMP(3) AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN TO_TIMESTAMP(
|
||
|
|
TO_CHAR(year, '0000') || TO_CHAR(month, '00') || TO_CHAR(day, '00') || TO_CHAR(hour, '00') || TO_CHAR(minute, '00') || TO_CHAR(second, '00'),
|
||
|
|
'yyyymmddHH24MISS'
|
||
|
|
);
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
-- note: in bigquery, `INTERVAL 1 YEAR` is a valid interval
|
||
|
|
-- but in postgres, it must be `INTERVAL '1' YEAR`
|
||
|
|
|
||
|
|
-- DATETIME_ADD(datetime, INTERVAL 'n' DATEPART) -> datetime + INTERVAL 'n' DATEPART
|
||
|
|
CREATE OR REPLACE FUNCTION DATETIME_ADD(datetime_val TIMESTAMP(3), intvl INTERVAL) RETURNS TIMESTAMP(3) AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN datetime_val + intvl;
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
CREATE OR REPLACE FUNCTION DATE_ADD(dt DATE, intvl INTERVAL) RETURNS TIMESTAMP(3) AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN CAST(dt AS TIMESTAMP(3)) + intvl;
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
-- DATETIME_SUB(datetime, INTERVAL 'n' DATEPART) -> datetime - INTERVAL 'n' DATEPART
|
||
|
|
CREATE OR REPLACE FUNCTION DATETIME_SUB(datetime_val TIMESTAMP(3), intvl INTERVAL) RETURNS TIMESTAMP(3) AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN datetime_val - intvl;
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
CREATE OR REPLACE FUNCTION DATE_SUB(dt DATE, intvl INTERVAL) RETURNS TIMESTAMP(3) AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN CAST(dt AS TIMESTAMP(3)) - intvl;
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
-- TODO:
|
||
|
|
-- DATETIME_TRUNC(datetime, PART) -> DATE_TRUNC('datepart', datetime)
|
||
|
|
|
||
|
|
-- below requires a regex to convert datepart from primitive to a string
|
||
|
|
-- i.e. encapsulate it in single quotes
|
||
|
|
CREATE OR REPLACE FUNCTION DATETIME_DIFF(endtime TIMESTAMP(3), starttime TIMESTAMP(3), datepart TEXT) RETURNS NUMERIC AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN
|
||
|
|
EXTRACT(EPOCH FROM endtime - starttime) /
|
||
|
|
CASE
|
||
|
|
WHEN datepart = 'SECOND' THEN 1.0
|
||
|
|
WHEN datepart = 'MINUTE' THEN 60.0
|
||
|
|
WHEN datepart = 'HOUR' THEN 3600.0
|
||
|
|
WHEN datepart = 'DAY' THEN 24*3600.0
|
||
|
|
WHEN datepart = 'YEAR' THEN 365.242*24*3600.0
|
||
|
|
ELSE NULL END;
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
-- BigQuery has a custom data type, PART
|
||
|
|
-- It's difficult to replicate this in postgresql, which recognizes the PART as a column name,
|
||
|
|
-- unless it is within an EXTRACT() function.
|
||
|
|
|
||
|
|
CREATE OR REPLACE FUNCTION BIGQUERY_FORMAT_TO_PSQL(format_str VARCHAR(255)) RETURNS TEXT AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN
|
||
|
|
-- use replace to convert BigQuery string format to postgres string format
|
||
|
|
-- only handles a few cases since we don't extensively use this function
|
||
|
|
REPLACE(
|
||
|
|
REPLACE(
|
||
|
|
REPLACE(
|
||
|
|
REPLACE(
|
||
|
|
REPLACE(
|
||
|
|
REPLACE(
|
||
|
|
format_str
|
||
|
|
, '%S', 'SS'
|
||
|
|
)
|
||
|
|
, '%M', 'MI'
|
||
|
|
)
|
||
|
|
, '%H', 'HH24'
|
||
|
|
)
|
||
|
|
, '%d', 'dd'
|
||
|
|
)
|
||
|
|
, '%m', 'mm'
|
||
|
|
)
|
||
|
|
, '%Y', 'yyyy'
|
||
|
|
)
|
||
|
|
;
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
|
||
|
|
CREATE OR REPLACE FUNCTION FORMAT_DATE(format_str VARCHAR(255), datetime_val TIMESTAMP(3)) RETURNS TEXT AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN TO_CHAR(
|
||
|
|
datetime_val,
|
||
|
|
-- use replace to convert BigQuery string format to postgres string format
|
||
|
|
-- only handles a few cases since we don't extensively use this function
|
||
|
|
BIGQUERY_FORMAT_TO_PSQL(format_str)
|
||
|
|
);
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
|
||
|
|
CREATE OR REPLACE FUNCTION PARSE_DATE(format_str VARCHAR(255), string_val VARCHAR(255)) RETURNS DATE AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN TO_DATE(
|
||
|
|
string_val,
|
||
|
|
-- use replace to convert BigQuery string format to postgres string format
|
||
|
|
-- only handles a few cases since we don't extensively use this function
|
||
|
|
BIGQUERY_FORMAT_TO_PSQL(format_str)
|
||
|
|
);
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
CREATE OR REPLACE FUNCTION FORMAT_DATETIME(format_str VARCHAR(255), datetime_val TIMESTAMP(3)) RETURNS TEXT AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN TO_CHAR(
|
||
|
|
datetime_val,
|
||
|
|
-- use replace to convert BigQuery string format to postgres string format
|
||
|
|
-- only handles a few cases since we don't extensively use this function
|
||
|
|
BIGQUERY_FORMAT_TO_PSQL(format_str)
|
||
|
|
);
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|
||
|
|
|
||
|
|
|
||
|
|
CREATE OR REPLACE FUNCTION PARSE_DATETIME(format_str VARCHAR(255), string_val VARCHAR(255)) RETURNS TIMESTAMP(3) AS $$
|
||
|
|
BEGIN
|
||
|
|
RETURN TO_TIMESTAMP(
|
||
|
|
string_val,
|
||
|
|
-- use replace to convert BigQuery string format to postgres string format
|
||
|
|
-- only handles a few cases since we don't extensively use this function
|
||
|
|
BIGQUERY_FORMAT_TO_PSQL(format_str)
|
||
|
|
);
|
||
|
|
END; $$
|
||
|
|
LANGUAGE PLPGSQL;
|