Thread: Number of days in a tstzrange?
Hi folks, How can the number of days contained within a range be found? (9.2) For example, with these timestamp ranges, get these (integer) number of days: tstzrange('2013-10-01 07:00', '2013-10-01 07:15') | 1 (day) tstzrange('2013-10-01 07:00', '2013-10-01 23:45') | 1 (day) tstzrange('2013-10-01 02:00', '2013-10-02 23:45') | 2 (days) tstzrange('2013-10-01 07:00', '2013-10-03 01:00') | 2 (days) tstzrange('2013-10-01 01:00', '2013-10-03 23:00') | 3 (days) tstzrange('2013-10-01 23:00', '2013-10-04 01:00') | 4 (days) In my digging about, I've not found a builtin function for this. Is is necessary pull out the lower() and upper() timestamp elements, then get the date interval between them? Cheers, -- Craig Skinner | http://twitter.com/Craig_Skinner | http://linkd.in/yGqkv7
On Oct 24, 2013, at 4:46 PM, Craig R. Skinner wrote: > Hi folks, > > How can the number of days contained within a range be found? (9.2) > > For example, with these timestamp ranges, > get these (integer) number of days: > > tstzrange('2013-10-01 07:00', '2013-10-01 07:15') | 1 (day) > tstzrange('2013-10-01 07:00', '2013-10-01 23:45') | 1 (day) > tstzrange('2013-10-01 02:00', '2013-10-02 23:45') | 2 (days) > tstzrange('2013-10-01 07:00', '2013-10-03 01:00') | 2 (days) > tstzrange('2013-10-01 01:00', '2013-10-03 23:00') | 3 (days) > tstzrange('2013-10-01 23:00', '2013-10-04 01:00') | 4 (days) > > In my digging about, I've not found a builtin function for this. > > Is is necessary pull out the lower() and upper() timestamp elements, > then get the date interval between them? Yes, you would have to call lower() and upper() to accomplish that. Jonathan
On 2013-10-24 Thu 17:00 PM |, Jonathan S. Katz wrote: > > Yes, you would have to call lower() and upper() to accomplish that. > Here's my final solution inside a function's CUSROR LOOP: DECLAREbillable_days integer;..... BEGIN......SELECT -- cast boundries to date -- date - date = integer upper(billable_item.billable_period)::date- lower(billable_item.billable_period)::dateINTO billable_days; -- if a subscription is ceased same day it's started,-- that day is still chargable, so bump itIF billable_days < 1THEN billable_days := 1;END IF;...... Thanks, -- Craig Skinner | http://twitter.com/Craig_Skinner | http://linkd.in/yGqkv7
On 2013-10-29 Tue 11:34 AM |, Craig R. Skinner wrote: > > -- if a subscription is ceased same day it's started, > -- that day is still chargable, so bump it > IF billable_days < 1 > THEN > billable_days := 1; > END IF; > ... > ... > This is more accurate: -- If a subscription billing_period ends part way through a day,IF upper(billable_item.billable_period)::time <> time 'allballs'THEN -- That partial day is still chargable, so bump it billable_days := billable_days + 1;END IF;
On 30/10/13 23:40, Craig R. Skinner wrote: > On 2013-10-29 Tue 11:34 AM |, Craig R. Skinner wrote: >> -- if a subscription is ceased same day it's started, >> -- that day is still chargable, so bump it >> IF billable_days < 1 >> THEN >> billable_days := 1; >> END IF; >> ... >> ... >> > This is more accurate: > > -- If a subscription billing_period ends part way through a day, > IF upper(billable_item.billable_period)::time <> time 'allballs' > THEN > -- That partial day is still chargable, so bump it > billable_days := billable_days + 1; > END IF; > > > even for 1 second over??? I would expect any court of law to set a higher threshold! Cheers, Gavin