pg.ddx.io pgsql-sql@postgresql.org mailing list archive
help / color / mirror / Atom feedRe: SQL to Check whether "AN HOUR PERIOD" is between start and end timestamps
5+ messages / 5 participants
[nested] [flat]
* Re: SQL to Check whether "AN HOUR PERIOD" is between start and end timestamps
@ 2009-04-02 12:31 James Kitambara <jameskitambara@yahoo.co.uk>
0 siblings, 1 reply; 5+ messages in thread
From: James Kitambara @ 2009-04-02 12:31 UTC (permalink / raw)
To: Srikanth <rssrik@yahoo.co.in>; +Cc: pgsql-sql
Dear Srikanth,
You can solve your problem by doing this
THE SQL IS AS FOLLOWS
ASSUME TIME INTERVAL 2008-12-07 07:59:59 TO 2008-12-07 08:58:59 AND THE TABLE NAME time_interval
COUNT (*) FROM
(select customer_id, log_session_id, start_ts, end_ts , end_ts-start_ts as "Interval" from time_interval
where end_ts-start_ts >= '1 hour'
and '2008-12-07 07:59:59' between start_ts and end_ts)
AS COUNT ;
------------------------------------------ORGINAL MESSAGE--------------------------------------------------------------
________________________________
From: Richard Huxton <dev@archonet.com>
To: Srikanth <rssrik@yahoo.co.in>
Cc: pgsql-sql@postgresql.org
Sent: Tuesday, 17 March, 2009 18:06:09
Subject: Re: [SQL] SQL to Check whether "AN HOUR PERIOD" is between start and end timestamps
Dear all,
I have a table that records User Login Sessions with two timestamp fields.
Basically Start of Session and End of a Session (start_ts and end_ts). Each row in the table identifies a session which a customer has used.
Data from the table (session):
-----------------------------
customer_id | log_session_id | start_ts | end_ts
-------------+-----------------+----------------------------+----------------------------
1006100716 | 209571229340224 | 15/12/2008 16:53:52.665327 | 15/12/2008 16:58:52.665327
1006100789 | 112061228488202 | 05/12/2008 20:13:32.773065 | 09/12/2008 22:59:02.770218
1006100888 | 214221233045949 | 27/01/2009 14:15:16.289626 | 27/01/2009 14:58:59.989182
1006000008 | 205221236839534 | 12/03/2009 12:02:15.947509 | 12/03/2009 12:07:15.947509
1006100825 | 112331229068049 | 12/12/2008 13:17:37.229249 | 12/12/2008 13:56:58.394577
The requirement is as follows,
I have to find out how many User Sessions that were present in any given "1 HOUR TIME PERIOD". A single User Session can span across many days.
Example:
start_ts | end_ts
05/12/2008 20:13:32.773065 | 09/12/2008 22:59:02.770218
-----------------------------------------------------------------------------------------------------
Let me explain a scenario,
I have to find out the number of sessions during the interval '07/01/2009 11:00:00' to '07/01/2009 11:59:59'.
If I have to find the number of sessions present at any instant time say '07/01/2009 11:25:25', i can easily find out using the following Query,
select count(log_session_id) from session where '07/01/2009 11:25:25' between start_ts and end_ts ;
But, I have to find the number of sessions present during the "HOUR INTERVAL" '07/01/2009 11:00:00' to '07/01/2009 11:59:59'.
I tried using wildcards in timestamp '07/01/2009 11:%:%" but in vain. I tries googling / searching archives without any success either.
I feel this is a general requirement and this topic should have already been discussed.
Could someone help me solve this please ? Any lead would do, like some special postgres-function or any other means.
Many Thanks,
^ permalink raw reply [nested|flat] 5+ messages in thread
* Re: SQL to Check whether "AN HOUR PERIOD" is between start and end timestamps
@ 2009-04-02 13:54 Alvaro Herrera <alvherre@commandprompt.com>
parent: James Kitambara <jameskitambara@yahoo.co.uk>
0 siblings, 2 replies; 5+ messages in thread
From: Alvaro Herrera @ 2009-04-02 13:54 UTC (permalink / raw)
To: James Kitambara <jameskitambara@yahoo.co.uk>; +Cc: Srikanth <rssrik@yahoo.co.in>; pgsql-sql
James Kitambara wrote:
> Dear Srikanth,
> You can solve your problem by doing this
>
> THE SQL IS AS FOLLOWS
> ASSUME TIME INTERVAL 2008-12-07 07:59:59 TO 2008-12-07 08:58:59 AND THE TABLE NAME time_interval
>
> COUNT (*) FROM
> (select customer_id, log_session_id, start_ts, end_ts , end_ts-start_ts as "Interval" from time_interval
> where end_ts-start_ts >= '1 hour'
> and '2008-12-07 07:59:59' between start_ts and end_ts)
> AS COUNT ;
Another way to phrase the WHERE clause is with the OVERLAPS operator,
something like this:
WHERE (start_ts, end_ts) OVERLAPS ('2008-12-07 07:59:59', '2008-12-07 08:59:59')
What I'm not so sure about is how optimizable this construct is.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
^ permalink raw reply [nested|flat] 5+ messages in thread
* Re: SQL to Check whether "AN HOUR PERIOD" is between start and end timestamps
@ 2009-04-02 15:00 Tom Lane <tgl@sss.pgh.pa.us>
parent: Alvaro Herrera <alvherre@commandprompt.com>
1 sibling, 0 replies; 5+ messages in thread
From: Tom Lane @ 2009-04-02 15:00 UTC (permalink / raw)
To: Alvaro Herrera <alvherre@commandprompt.com>; +Cc: James Kitambara <jameskitambara@yahoo.co.uk>; Srikanth <rssrik@yahoo.co.in>; pgsql-sql
Alvaro Herrera <alvherre@commandprompt.com> writes:
> Another way to phrase the WHERE clause is with the OVERLAPS operator,
> something like this:
> WHERE (start_ts, end_ts) OVERLAPS ('2008-12-07 07:59:59', '2008-12-07 08:59:59')
> What I'm not so sure about is how optimizable this construct is.
Not at all :-( --- or at least, our code doesn't do anything with
it currrently; I shouldn't claim that it's impossible to optimize.
regards, tom lane
^ permalink raw reply [nested|flat] 5+ messages in thread
* Re: SQL to Check whether "AN HOUR PERIOD" is between start and end timestamps
@ 2009-04-10 22:41 Jasen Betts <jasen@xnet.co.nz>
parent: Alvaro Herrera <alvherre@commandprompt.com>
1 sibling, 1 reply; 5+ messages in thread
From: Jasen Betts @ 2009-04-10 22:41 UTC (permalink / raw)
To: pgsql-sql
On 2009-04-02, Alvaro Herrera <alvherre@commandprompt.com> wrote:
> James Kitambara wrote:
>> Dear Srikanth,
>> You can solve your problem by doing this
>>
>> THE SQL IS AS FOLLOWS
>> ASSUME TIME INTERVAL 2008-12-07 07:59:59 TO 2008-12-07 08:58:59 AND THE TABLE NAME time_interval
>>
>> COUNT (*) FROM
>> (select customer_id, log_session_id, start_ts, end_ts , end_ts-start_ts as "Interval" from time_interval
>> where end_ts-start_ts >= '1 hour'
>> and '2008-12-07 07:59:59' between start_ts and end_ts)
>> AS COUNT ;
>
> Another way to phrase the WHERE clause is with the OVERLAPS operator,
> something like this:
>
> WHERE (start_ts, end_ts) OVERLAPS ('2008-12-07 07:59:59', '2008-12-07 08:59:59')
>
> What I'm not so sure about is how optimizable this construct is.
>
http://www.postgresql.org/docs/8.3/interactive/xindex.html
if you gave the apropriate GIST index on (start_ts, end_ts) the
overlaps may be optimisable. the subquery will run to completion
and count will count the results. - but this form gives different results.
beter to do
select COUNT (*) AS COUNT FROM time_interval
WHERE (start_ts, end_ts) OVERLAPS ('2008-12-07 07:59:59', '2008-12-07 08:59:59')
or
select COUNT (*) AS COUNT FROM time_interval
where end_ts-start_ts >= '1 hour'
and '2008-12-07 07:59:59' between start_ts and end_ts;
^ permalink raw reply [nested|flat] 5+ messages in thread
* Re: Re: SQL to Check whether "AN HOUR PERIOD" is between start and end timestamps
@ 2009-04-16 10:21 Andreas Joseph Krogh <andreak@officenet.no>
parent: Jasen Betts <jasen@xnet.co.nz>
0 siblings, 0 replies; 5+ messages in thread
From: Andreas Joseph Krogh @ 2009-04-16 10:21 UTC (permalink / raw)
To: pgsql-sql
On Saturday 11 April 2009 00:41:54 Jasen Betts wrote:
> On 2009-04-02, Alvaro Herrera <alvherre@commandprompt.com> wrote:
> > James Kitambara wrote:
> >> Dear Srikanth,
> >> You can solve your problem by doing this
> >>
> >> THE SQL IS AS FOLLOWS
> >> ASSUME TIME INTERVAL 2008-12-07 07:59:59 TO 2008-12-07 08:58:59 AND THE TABLE NAME time_interval
> >>
> >> COUNT (*) FROM
> >> (select customer_id, log_session_id, start_ts, end_ts , end_ts-start_ts as "Interval" from time_interval
> >> where end_ts-start_ts >= '1 hour'
> >> and '2008-12-07 07:59:59' between start_ts and end_ts)
> >> AS COUNT ;
> >
> > Another way to phrase the WHERE clause is with the OVERLAPS operator,
> > something like this:
> >
> > WHERE (start_ts, end_ts) OVERLAPS ('2008-12-07 07:59:59', '2008-12-07 08:59:59')
> >
> > What I'm not so sure about is how optimizable this construct is.
> >
>
> http://www.postgresql.org/docs/8.3/interactive/xindex.html
> if you gave the apropriate GIST index on (start_ts, end_ts) the
> overlaps may be optimisable. the subquery will run to completion
> and count will count the results. - but this form gives different results.
>
> beter to do
>
> select COUNT (*) AS COUNT FROM time_interval
> WHERE (start_ts, end_ts) OVERLAPS ('2008-12-07 07:59:59', '2008-12-07 08:59:59')
>
> or
>
> select COUNT (*) AS COUNT FROM time_interval
> where end_ts-start_ts >= '1 hour'
> and '2008-12-07 07:59:59' between start_ts and end_ts;
I only managed to get this to use the gist-index, and not with the overlaps operator. I had to install the contrib-module btree_gist in order to be able to create a gist index on the timestamps.
This is my index:
CREATE index origo_tart_end_time_idx on onp_crm_activity_log using gist (start_time, end_time) ;
start_time and end_time are both timestamps.
Here are the EXPLAIN outputs:
andreak=# EXPLAIN ANALYZE select id from onp_crm_activity_log where end_time - start_time >= '1 hour' AND '2008-12-07 07:59:59' between start_time and end_time;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on onp_crm_activity_log (cost=10.56..232.62 rows=76 width=4) (actual time=0.175..0.175 rows=0 loops=1)
Recheck Cond: (('2008-12-07 07:59:59'::timestamp without time zone >= start_time) AND ('2008-12-07 07:59:59'::timestamp without time zone <= end_time))
Filter: ((end_time - start_time) >= '01:00:00'::interval)
-> Bitmap Index Scan on origo_tart_end_time_idx (cost=0.00..10.54 rows=229 width=0) (actual time=0.168..0.168 rows=0 loops=1)
Index Cond: (('2008-12-07 07:59:59'::timestamp without time zone >= start_time) AND ('2008-12-07 07:59:59'::timestamp without time zone <= end_time))
Total runtime: 0.274 ms
(6 rows)
andreak=# EXPLAIN ANALYZE select id from onp_crm_activity_log where (start_time, end_time) OVERLAPS('2008-11-07 07:59:59'::timestamp, '2008-12-07 08:59:59'::timestamp);
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------
Seq Scan on onp_crm_activity_log (cost=0.00..319.29 rows=2968 width=4) (actual time=14.542..15.794 rows=83 loops=1)
Filter: "overlaps"(start_time, end_time, '2008-11-07 07:59:59'::timestamp without time zone, '2008-12-07 08:59:59'::timestamp without time zone)
Total runtime: 16.129 ms
(3 rows)
Is it possible to make the overlaps operator use the index? I'd prefer the overlaps-syntax as I find it cleaner.
--
Andreas Joseph Krogh <andreak@officenet.no>
Senior Software Developer / CEO
------------------------+---------------------------------------------+
OfficeNet AS | The most difficult thing in the world is to |
Rosenholmveien 25 | know how to do a thing and to watch |
1414 Trollåsen | somebody else doing it wrong, without |
NORWAY | comment. |
| |
Tlf: +47 24 15 38 90 | |
Fax: +47 24 15 38 91 | |
Mobile: +47 909 56 963 | |
------------------------+---------------------------------------------+
^ permalink raw reply [nested|flat] 5+ messages in thread
end of thread, other threads:[~2009-04-16 10:21 UTC | newest]
Thread overview: 5+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2009-04-02 12:31 Re: SQL to Check whether "AN HOUR PERIOD" is between start and end timestamps James Kitambara <jameskitambara@yahoo.co.uk>
2009-04-02 13:54 ` Alvaro Herrera <alvherre@commandprompt.com>
2009-04-02 15:00 ` Tom Lane <tgl@sss.pgh.pa.us>
2009-04-10 22:41 ` Jasen Betts <jasen@xnet.co.nz>
2009-04-16 10:21 ` Andreas Joseph Krogh <andreak@officenet.no>
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox