Skip to content

Instantly share code, notes, and snippets.

@cecepm
Created December 23, 2014 04:51
Show Gist options
  • Select an option

  • Save cecepm/ce2bd3ebd8a48a3a3c37 to your computer and use it in GitHub Desktop.

Select an option

Save cecepm/ce2bd3ebd8a48a3a3c37 to your computer and use it in GitHub Desktop.
PostgreSQL: round time function
CREATE OR REPLACE FUNCTION round_minutes( TIMESTAMP WITH TIME ZONE, integer)
RETURNS TIMESTAMP WITH TIME ZONE AS $$
SELECT date_trunc('hour', $1) + (cast(($2::varchar||' min') as interval) * round( (date_part('minute',$1)::float + date_part('second',$1)/ 60.)::float / cast($2 as float)))
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION floor_minutes( TIMESTAMP WITH TIME ZONE, integer )
RETURNS TIMESTAMP WITH TIME ZONE AS $$
SELECT round_minutes( $1 - cast((($2/2)::varchar ||' min') as interval ), $2 );
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION ceiling_minutes( TIMESTAMP WITH TIME ZONE, integer )
RETURNS TIMESTAMP WITH TIME ZONE AS $$
SELECT round_minutes( $1 + cast((($2/2)::varchar ||' min') as interval ), $2 );
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION round_hours( TIMESTAMP WITH TIME ZONE, integer)
RETURNS TIMESTAMP WITH TIME ZONE AS $$
SELECT date_trunc('day', $1) + (cast(($2::varchar||' hour') as interval) * round( (date_part('hour',$1)::float + date_part('minute',$1)/ 60. + date_part('second',$1)/ 3600.)::float / cast($2 as float)))
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION floor_hours( TIMESTAMP WITH TIME ZONE, integer )
RETURNS TIMESTAMP WITH TIME ZONE AS $$
SELECT round_hours( $1 - cast((($2/2)::varchar ||' hour') as interval ), $2 );
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION ceiling_hours( TIMESTAMP WITH TIME ZONE, integer )
RETURNS TIMESTAMP WITH TIME ZONE AS $$
SELECT round_hours( $1 + cast((($2/2)::varchar ||' hour') as interval ), $2 );
$$ LANGUAGE SQL IMMUTABLE;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment