Skip to content

Instantly share code, notes, and snippets.

@jpotts18
Last active October 13, 2020 10:33
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jpotts18/36e4f6d469fb9b66d94059f9d3e07497 to your computer and use it in GitHub Desktop.
Save jpotts18/36e4f6d469fb9b66d94059f9d3e07497 to your computer and use it in GitHub Desktop.
Time Dimension for Postgres
CREATE TABLE "public"."times" (
id int4 NOT NULL,
time time,
hour int2,
military_hour int2,
minute int4,
second int4,
minute_of_day int4,
second_of_day int4,
quarter_hour varchar,
am_pm varchar,
day_night varchar,
day_night_abbrev varchar,
time_period varchar,
time_period_abbrev varchar
)
WITH (OIDS=FALSE);
TRUNCATE TABLE times;
-- Unknown member
INSERT INTO times VALUES (
-1, --id
'0:0:0', -- time
0, -- hour
0, -- military_hour
0, -- minute
0, -- second
0, -- minute_of_day
0, -- second_of_day
'Unknown', -- quarter_hour
'Unknown', -- am_pm
'Unknown', -- day_night
'Unk', -- day_night_abbrev
'Unknown', -- time_period
'Unk' -- time_period_abbrev
);
INSERT INTO times
SELECT
to_char(datum, 'HH24MISS')::integer AS id,
datum::time AS time,
to_char(datum, 'HH12')::integer AS hour,
to_char(datum, 'HH24')::integer AS military_hour,
extract(minute FROM datum)::integer AS minute,
extract(second FROM datum) AS second,
to_char(datum, 'SSSS')::integer / 60 AS minute_of_day,
to_char(datum, 'SSSS')::integer AS second_of_day,
to_char(datum - (extract(minute FROM datum)::integer % 15 || 'minutes')::interval, 'hh24:mi') ||
' – ' ||
to_char(datum - (extract(minute FROM datum)::integer % 15 || 'minutes')::interval + '14 minutes'::interval, 'hh24:mi')
AS quarter_hour,
to_char(datum, 'AM') AS am_pm,
CASE WHEN to_char(datum, 'hh24:mi') BETWEEN '08:00' AND '19:59' THEN 'Day (8AM-8PM)' ELSE 'Night (8PM-8AM)' END
AS day_night,
CASE WHEN to_char(datum, 'hh24:mi') BETWEEN '08:00' AND '19:59' THEN 'Day' ELSE 'Night' END
AS day_night_abbrev,
CASE
WHEN to_char(datum, 'hh24:mi') BETWEEN '00:00' AND '03:59' THEN 'Late Night (Midnight-4AM)'
WHEN to_char(datum, 'hh24:mi') BETWEEN '04:00' AND '07:59' THEN 'Early Morning (4AM-8AM)'
WHEN to_char(datum, 'hh24:mi') BETWEEN '08:00' AND '11:59' THEN 'Morning (8AM-Noon)'
WHEN to_char(datum, 'hh24:mi') BETWEEN '12:00' AND '15:59' THEN 'Afternoon (Noon-4PM)'
WHEN to_char(datum, 'hh24:mi') BETWEEN '16:00' AND '19:59' THEN 'Evening (4PM-8PM)'
WHEN to_char(datum, 'hh24:mi') BETWEEN '20:00' AND '23:59' THEN 'Night (8PM-Midnight)'
END AS time_period,
CASE
WHEN to_char(datum, 'hh24:mi') BETWEEN '00:00' AND '03:59' THEN 'Late Night'
WHEN to_char(datum, 'hh24:mi') BETWEEN '04:00' AND '07:59' THEN 'Early Morning'
WHEN to_char(datum, 'hh24:mi') BETWEEN '08:00' AND '11:59' THEN 'Morning'
WHEN to_char(datum, 'hh24:mi') BETWEEN '12:00' AND '15:59' THEN 'Afternoon'
WHEN to_char(datum, 'hh24:mi') BETWEEN '16:00' AND '19:59' THEN 'Evening'
WHEN to_char(datum, 'hh24:mi') BETWEEN '20:00' AND '23:59' THEN 'Night'
END AS time_period_abbrev
FROM generate_series('2000-01-01 00:00:00'::timestamp, '2000-01-01 23:59:59'::timestamp, '1 second') datum;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment