Advertisement
Guest User

Untitled

a guest
Jul 26th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.66 KB | None | 0 0
  1. CREATE TABLE recordings(tstart timestamp, tend timestamp, interval ticklength);
  2.  
  3. SELECT (tend - tstart) / ticklength AS numticks
  4. FROM recordings;
  5.  
  6. SELECT
  7. (1000*EXTRACT(EPOCH FROM tend - tstart)
  8. + EXTRACT(MILLISECOND FROM tend - tstart))
  9. / (1000*EXTRACT(EPOCH FROM ticklength)
  10. + EXTRACT(MILLISECOND FROM ticklength)) AS numticks
  11. FROM recordings;
  12.  
  13. -- An interval consists of a number of years, months, days, hours,
  14. -- minutes, and seconds. The problem of dividing two intervals lies
  15. -- in the fact that "one month" is not a fixed number of days.
  16. -- Therefore, dividing, say, P1M with P1D would not make sense.
  17.  
  18. CREATE OR REPLACE FUNCTION interval_months_part(INTERVAL)
  19. RETURNS INTEGER AS $$
  20. SELECT EXTRACT(years FROM $1)::INTEGER * 12
  21. + EXTRACT(months FROM $1)::INTEGER
  22. $$ LANGUAGE SQL IMMUTABLE STRICT;
  23. COMMENT ON FUNCTION interval_months_part(INTERVAL) IS
  24. 'Years plus months as a whole number of months';
  25.  
  26. CREATE OR REPLACE FUNCTION interval_seconds_part(INTERVAL)
  27. RETURNS DOUBLE PRECISION AS $$
  28. SELECT EXTRACT(days FROM $1) * 24 * 60 * 60
  29. + EXTRACT(hours FROM $1) * 60 * 60
  30. + EXTRACT(mins FROM $1) * 60
  31. + EXTRACT(secs FROM $1);
  32. $$ LANGUAGE SQL IMMUTABLE STRICT;
  33. COMMENT ON FUNCTION interval_months_part(INTERVAL) IS
  34. 'Days, hours, minutes, and seconds as seconds';
  35.  
  36. -- If we can divide exactly, do so. Otherwise return NULL, unless
  37. -- fudging is requested, in which case all months are implicitly
  38. -- assumed to be 30 days, (except for 12 months, which become 365.25
  39. -- days), by extracting and dividing the epochs.
  40. CREATE OR REPLACE FUNCTION interval_divide(dividend INTERVAL,
  41. divisor INTERVAL,
  42. fudge BOOL DEFAULT false)
  43. RETURNS DOUBLE PRECISION AS $$
  44. SELECT CASE WHEN interval_months_part($1) = 0
  45. AND interval_months_part($2) = 0
  46. THEN interval_seconds_part($1)
  47. / interval_seconds_part($2)
  48. WHEN interval_seconds_part($1) = 0
  49. AND interval_seconds_part($2) = 0
  50. THEN CAST(interval_months_part($1)
  51. AS DOUBLE PRECISION)
  52. / interval_months_part($2)
  53. ELSE CASE WHEN fudge
  54. THEN EXTRACT(EPOCH FROM $1)
  55. / EXTRACT(EPOCH FROM $2)
  56. ELSE NULL
  57. END
  58. END;
  59. $$ LANGUAGE SQL IMMUTABLE STRICT;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement