--The problem (8.2.11):
SELECT
 resource,
 category,
 userid,
 title,
 year,
 month,
 SUM(hours)
FROM
 (
  SELECT
   r.name AS resource,
   ARRAY(SELECT ca.cat_name FROM egw_categories ca WHERE ca.cat_id::text = ANY (string_to_array(c.cal_category, ','))) AS category,
   cu.cal_user_id AS userid,
   c.cal_title AS title,
   EXTRACT(year FROM (TIMESTAMP WITH TIME ZONE 'epoch' + cd.cal_start * INTERVAL '1 second')) AS year,
   EXTRACT(month FROM (TIMESTAMP WITH TIME ZONE 'epoch' + cd.cal_start * INTERVAL '1 second')) AS month,
   (cd.cal_end - cd.cal_start) * INTERVAL '1 second' AS hours
  FROM egw_cal_user cr
  JOIN egw_cal_dates cd
   ON
    cd.cal_id = cr.cal_id AND
    cr.cal_recur_date = COALESCE((SELECT cd.cal_start FROM egw_cal_dates icd WHERE icd.cal_id = cd.cal_id AND icd.cal_start = cd.cal_start AND icd.cal_start <> 0), 0)
  JOIN egw_resources r
   ON
    r.res_id = cr.cal_user_id AND
    cr.cal_user_type = 'r'
  JOIN egw_categories ct
   ON ct.cat_id = r.cat_id
  JOIN egw_cal c
   ON c.cal_id = cd.cal_id
  LEFT JOIN egw_cal_user cu
   ON
    cu.cal_id = cr.cal_id AND
    cu.cal_user_type = 'u' AND
    cu.cal_recur_date = COALESCE((SELECT cd.cal_start FROM egw_cal_dates icd WHERE icd.cal_id = cd.cal_id AND icd.cal_start = cd.cal_start AND icd.cal_start <> 0), 0)
  WHERE
   ct.cat_main = 133 AND
   r.res_id = 8522 AND
   cu.cal_user_id = 278827 AND
   EXTRACT(year FROM (TIMESTAMP 'epoch' + cd.cal_start * INTERVAL '1 second')) = 2008 AND
   EXTRACT(month FROM (TIMESTAMP 'epoch' + cd.cal_start * INTERVAL '1 second')) IN (10,11,12)
 ) foo
GROUP BY
 resource,
 category,
 userid,
 title,
 year,
 month
ORDER BY
 year,
 month,
 resource,
 category,
 userid,
 title;
                                                                                                                                                                                       QUERY PLAN                                                                                                                                                                                       
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 GroupAggregate  (cost=125.20..183.67 rows=1 width=180) (actual time=475276.902..475277.130 rows=4 loops=1)
   ->  Sort  (cost=125.20..125.20 rows=1 width=180) (actual time=475276.822..475276.920 rows=64 loops=1)
         Sort Key: date_part('year'::text, ('1969-12-31 21:00:00-03'::timestamp with time zone + ((cd.cal_start)::double precision * '00:00:01'::interval))), date_part('month'::text, ('1969-12-31 21:00:00-03'::timestamp with time zone + ((cd.cal_start)::double precision * '00:00:01'::interval))), r.name, (subplan), cu.cal_user_id, c.cal_title
         ->  Nested Loop  (cost=0.00..125.19 rows=1 width=180) (actual time=22188.889..475275.364 rows=64 loops=1)
               Join Filter: ((cr.cal_recur_date = COALESCE((subplan), 0::bigint)) AND (cu.cal_recur_date = COALESCE((subplan), 0::bigint)))
               ->  Nested Loop  (cost=0.00..42.00 rows=1 width=192) (actual time=0.535..2788.339 rows=511222 loops=1)
                     ->  Nested Loop  (cost=0.00..38.71 rows=1 width=171) (actual time=0.121..90.021 rows=1105 loops=1)
                           ->  Nested Loop  (cost=0.00..35.84 rows=1 width=120) (actual time=0.104..18.855 rows=1105 loops=1)
                                 ->  Nested Loop  (cost=0.00..16.55 rows=1 width=112) (actual time=0.046..0.058 rows=1 loops=1)
                                       ->  Index Scan using egw_resources_pkey on egw_resources r  (cost=0.00..8.27 rows=1 width=116) (actual time=0.025..0.029 rows=1 loops=1)
                                             Index Cond: (res_id = 8522)
                                       ->  Index Scan using egw_categories_pkey on egw_categories ct  (cost=0.00..8.27 rows=1 width=4) (actual time=0.012..0.015 rows=1 loops=1)
                                             Index Cond: (ct.cat_id = r.cat_id)
                                             Filter: (cat_main = 133)
                                 ->  Index Scan using idx_egw_0001 on egw_cal_user cr  (cost=0.00..19.23 rows=4 width=21) (actual time=0.044..14.742 rows=1105 loops=1)
                                       Index Cond: (((r.res_id)::text = (cr.cal_user_id)::text) AND ((cr.cal_user_type)::text = 'r'::text))
                           ->  Index Scan using egw_cal_pkey on egw_cal c  (cost=0.00..2.86 rows=1 width=51) (actual time=0.053..0.056 rows=1 loops=1105)
                                 Index Cond: (cr.cal_id = c.cal_id)
                     ->  Index Scan using egw_cal_user_pkey on egw_cal_user cu  (cost=0.00..3.28 rows=1 width=21) (actual time=0.017..0.978 rows=463 loops=1105)
                           Index Cond: ((cu.cal_id = cr.cal_id) AND ((cu.cal_user_type)::text = 'u'::text) AND ((cu.cal_user_id)::text = '278827'::text))
               ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates cd  (cost=0.00..8.18 rows=1 width=20) (actual time=0.014..0.570 rows=30 loops=511222)
                     Index Cond: (cd.cal_id = cr.cal_id)
                     Filter: ((date_part('year'::text, ('1970-01-01 00:00:00'::timestamp without time zone + ((cal_start)::double precision * '00:00:01'::interval))) = 2008::double precision) AND (date_part('month'::text, ('1970-01-01 00:00:00'::timestamp without time zone + ((cal_start)::double precision * '00:00:01'::interval))) = ANY ('{10,11,12}'::double precision[])))
               SubPlan
                 ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates icd  (cost=0.00..8.28 rows=1 width=0) (actual time=0.004..0.006 rows=1 loops=29520)
                       Index Cond: ((cal_id = $2) AND (cal_start = $1))
                       Filter: (cal_start <> 0)
                 ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates icd  (cost=0.00..8.28 rows=1 width=0) (actual time=0.005..0.006 rows=1 loops=15158976)
                       Index Cond: ((cal_id = $2) AND (cal_start = $1))
                       Filter: (cal_start <> 0)
                 ->  Bitmap Heap Scan on egw_categories ca  (cost=30.59..58.41 rows=10 width=50) (actual time=0.024..0.025 rows=1 loops=64)
                       Recheck Cond: ((cat_id)::text = ANY (string_to_array(($0)::text, ','::text)))
                       ->  Bitmap Index Scan on idx_egw_0005  (cost=0.00..30.59 rows=10 width=0) (actual time=0.016..0.016 rows=1 loops=64)
                             Index Cond: ((cat_id)::text = ANY (string_to_array(($0)::text, ','::text)))
 Total runtime: 475277.646 ms
(35 registros)

--Good one:
SELECT
 resource,
 category,
 userid,
 title,
 year,
 month,
 SUM(hours)
FROM
 (
  SELECT
   r.name AS resource,
   ARRAY(SELECT ca.cat_name FROM egw_categories ca WHERE ca.cat_id::text = ANY (string_to_array(c.cal_category, ','))) AS category,
   cu.cal_user_id AS userid,
   c.cal_title AS title,
   EXTRACT(year FROM (TIMESTAMP WITH TIME ZONE 'epoch' + cd.cal_start * INTERVAL '1 second')) AS year,
   EXTRACT(month FROM (TIMESTAMP WITH TIME ZONE 'epoch' + cd.cal_start * INTERVAL '1 second')) AS month,
   (cd.cal_end - cd.cal_start) * INTERVAL '1 second' AS hours
  FROM egw_cal_user cr
  JOIN egw_cal_dates cd
   ON
    cd.cal_id = cr.cal_id AND
    cr.cal_recur_date = COALESCE((SELECT cd.cal_start FROM egw_cal_dates icd WHERE icd.cal_id = cd.cal_id AND icd.cal_start = cd.cal_start AND icd.cal_start <> 0), 0)
  JOIN egw_resources r
   ON
    r.res_id = cr.cal_user_id AND
    cr.cal_user_type = 'r'
  JOIN egw_categories ct
   ON ct.cat_id = r.cat_id
  JOIN egw_cal c
   ON c.cal_id = cd.cal_id
  LEFT JOIN egw_cal_user cu
   ON
    cu.cal_id = cr.cal_id AND
    cu.cal_user_type = 'u' AND
    cu.cal_recur_date = COALESCE((SELECT cd.cal_start FROM egw_cal_dates icd WHERE icd.cal_id = cd.cal_id AND icd.cal_start = cd.cal_start AND icd.cal_start <> 0), 0)
  WHERE
   ct.cat_main = 133 AND
   cu.cal_user_id = 278827 AND
   EXTRACT(year FROM (TIMESTAMP 'epoch' + cd.cal_start * INTERVAL '1 second')) = 2008 AND
   EXTRACT(month FROM (TIMESTAMP 'epoch' + cd.cal_start * INTERVAL '1 second')) IN (10,11,12)
 ) foo
GROUP BY
 resource,
 category,
 userid,
 title,
 year,
 month
ORDER BY
 year,
 month,
 resource,
 category,
 userid,
 title;
                                                                                                                                                                                                   QUERY PLAN                                                                                                                                                                                                   
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 GroupAggregate  (cost=257.62..316.09 rows=1 width=180) (actual time=135.885..136.112 rows=4 loops=1)
   ->  Sort  (cost=257.62..257.62 rows=1 width=180) (actual time=135.822..135.923 rows=64 loops=1)
         Sort Key: date_part('year'::text, ('1969-12-31 21:00:00-03'::timestamp with time zone + ((cd.cal_start)::double precision * '00:00:01'::interval))), date_part('month'::text, ('1969-12-31 21:00:00-03'::timestamp with time zone + ((cd.cal_start)::double precision * '00:00:01'::interval))), r.name, (subplan), cu.cal_user_id, c.cal_title
         ->  Nested Loop  (cost=40.72..257.61 rows=1 width=180) (actual time=91.067..134.580 rows=64 loops=1)
               ->  Nested Loop  (cost=40.72..190.89 rows=1 width=145) (actual time=90.951..131.857 rows=64 loops=1)
                     ->  Nested Loop  (cost=32.44..166.02 rows=1 width=132) (actual time=33.022..127.492 rows=196 loops=1)
                           Join Filter: ((r.res_id)::text = (cr.cal_user_id)::text)
                           ->  Nested Loop  (cost=32.44..110.02 rows=1 width=33) (actual time=32.927..82.418 rows=196 loops=1)
                                 ->  Bitmap Heap Scan on egw_cal_dates cd  (cost=24.16..35.42 rows=3 width=20) (actual time=3.834..10.337 rows=3871 loops=1)
                                       Recheck Cond: ((date_part('year'::text, ('1970-01-01 00:00:00'::timestamp without time zone + ((cal_start)::double precision * '00:00:01'::interval))) = 2008::double precision) AND (date_part('month'::text, ('1970-01-01 00:00:00'::timestamp without time zone + ((cal_start)::double precision * '00:00:01'::interval))) = ANY ('{10,11,12}'::double precision[])))
                                       ->  BitmapAnd  (cost=24.16..24.16 rows=3 width=0) (actual time=3.795..3.795 rows=0 loops=1)
                                             ->  Bitmap Index Scan on idx_egw_0002  (cost=0.00..5.99 rows=230 width=0) (actual time=1.972..1.972 rows=14118 loops=1)
                                                   Index Cond: (date_part('year'::text, ('1970-01-01 00:00:00'::timestamp without time zone + ((cal_start)::double precision * '00:00:01'::interval))) = 2008::double precision)
                                             ->  Bitmap Index Scan on idx_egw_0006  (cost=0.00..17.92 rows=687 width=0) (actual time=1.789..1.789 rows=12799 loops=1)
                                                   Index Cond: (date_part('month'::text, ('1970-01-01 00:00:00'::timestamp without time zone + ((cal_start)::double precision * '00:00:01'::interval))) = ANY ('{10,11,12}'::double precision[]))
                                 ->  Index Scan using egw_cal_user_pkey on egw_cal_user cr  (cost=8.28..16.57 rows=1 width=21) (actual time=0.005..0.005 rows=0 loops=3871)
                                       Index Cond: ((cd.cal_id = cr.cal_id) AND (cr.cal_recur_date = COALESCE((subplan), 0::bigint)) AND ((cr.cal_user_type)::text = 'r'::text))
                                       SubPlan
                                         ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates icd  (cost=0.00..8.28 rows=1 width=0) (actual time=0.005..0.006 rows=1 loops=3871)
                                               Index Cond: ((cal_id = $2) AND (cal_start = $1))
                                               Filter: (cal_start <> 0)
                                         ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates icd  (cost=0.00..8.28 rows=1 width=0) (never executed)
                                               Index Cond: ((cal_id = $2) AND (cal_start = $1))
                                               Filter: (cal_start <> 0)
                           ->  Nested Loop  (cost=0.00..55.80 rows=13 width=112) (actual time=0.013..0.197 rows=13 loops=196)
                                 ->  Index Scan using idx_egw_0003 on egw_categories ct  (cost=0.00..13.16 rows=3 width=4) (actual time=0.004..0.032 rows=15 loops=196)
                                       Index Cond: (cat_main = 133)
                                 ->  Index Scan using idx_egw_0004 on egw_resources r  (cost=0.00..14.08 rows=11 width=116) (actual time=0.003..0.005 rows=1 loops=2940)
                                       Index Cond: (ct.cat_id = r.cat_id)
                     ->  Index Scan using egw_cal_user_pkey on egw_cal_user cu  (cost=8.28..16.58 rows=1 width=21) (actual time=0.007..0.008 rows=0 loops=196)
                           Index Cond: ((cu.cal_id = cr.cal_id) AND (cu.cal_recur_date = COALESCE((subplan), 0::bigint)) AND ((cu.cal_user_type)::text = 'u'::text) AND ((cu.cal_user_id)::text = '278827'::text))
                           SubPlan
                             ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates icd  (cost=0.00..8.28 rows=1 width=0) (actual time=0.005..0.007 rows=1 loops=196)
                                   Index Cond: ((cal_id = $2) AND (cal_start = $1))
                                   Filter: (cal_start <> 0)
                             ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates icd  (cost=0.00..8.28 rows=1 width=0) (never executed)
                                   Index Cond: ((cal_id = $2) AND (cal_start = $1))
                                   Filter: (cal_start <> 0)
               ->  Index Scan using egw_cal_pkey on egw_cal c  (cost=0.00..8.27 rows=1 width=51) (actual time=0.004..0.006 rows=1 loops=64)
                     Index Cond: (c.cal_id = cd.cal_id)
               SubPlan
                 ->  Bitmap Heap Scan on egw_categories ca  (cost=30.59..58.41 rows=10 width=50) (actual time=0.013..0.015 rows=1 loops=64)
                       Recheck Cond: ((cat_id)::text = ANY (string_to_array(($0)::text, ','::text)))
                       ->  Bitmap Index Scan on idx_egw_0005  (cost=0.00..30.59 rows=10 width=0) (actual time=0.008..0.008 rows=1 loops=64)
                             Index Cond: ((cat_id)::text = ANY (string_to_array(($0)::text, ','::text)))
 Total runtime: 136.702 ms
(46 registros)

--Another good one:
SELECT
 resource,
 category,
 userid,
 title,
 year,
 month,
 SUM(hours)
FROM
 (
  SELECT
   r.name AS resource,
   ARRAY(SELECT ca.cat_name FROM egw_categories ca WHERE ca.cat_id::text = ANY (string_to_array(c.cal_category, ','))) AS category,
   cu.cal_user_id AS userid,
   c.cal_title AS title,
   EXTRACT(year FROM (TIMESTAMP WITH TIME ZONE 'epoch' + cd.cal_start * INTERVAL '1 second')) AS year,
   EXTRACT(month FROM (TIMESTAMP WITH TIME ZONE 'epoch' + cd.cal_start * INTERVAL '1 second')) AS month,
   (cd.cal_end - cd.cal_start) * INTERVAL '1 second' AS hours
  FROM egw_cal_user cr
  JOIN egw_cal_dates cd
   ON
    cd.cal_id = cr.cal_id AND
    cr.cal_recur_date = COALESCE((SELECT cd.cal_start FROM egw_cal_dates icd WHERE icd.cal_id = cd.cal_id AND icd.cal_start = cd.cal_start AND icd.cal_start <> 0), 0)
  JOIN egw_resources r
   ON
    r.res_id = cr.cal_user_id AND
    cr.cal_user_type = 'r'
  JOIN egw_categories ct
   ON ct.cat_id = r.cat_id
  JOIN egw_cal c
   ON c.cal_id = cd.cal_id
  LEFT JOIN egw_cal_user cu
   ON
    cu.cal_id = cr.cal_id AND
    cu.cal_user_type = 'u' AND
    cu.cal_recur_date = COALESCE((SELECT cd.cal_start FROM egw_cal_dates icd WHERE icd.cal_id = cd.cal_id AND icd.cal_start = cd.cal_start AND icd.cal_start <> 0), 0)
  WHERE
   ct.cat_main = 133 AND
   r.res_id = 8522 AND
   EXTRACT(year FROM (TIMESTAMP 'epoch' + cd.cal_start * INTERVAL '1 second')) = 2008 AND
   EXTRACT(month FROM (TIMESTAMP 'epoch' + cd.cal_start * INTERVAL '1 second')) IN (10,11,12)
 ) foo
GROUP BY
 resource,
 category,
 userid,
 title,
 year,
 month
ORDER BY
 year,
 month,
 resource,
 category,
 userid,
 title;
                                                                                                                                                                                          QUERY PLAN                                                                                                                                                                                          
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 GroupAggregate  (cost=132.17..190.64 rows=1 width=180) (actual time=978.502..979.174 rows=18 loops=1)
   ->  Sort  (cost=132.17..132.17 rows=1 width=180) (actual time=978.448..978.686 rows=160 loops=1)
         Sort Key: date_part('year'::text, ('1969-12-31 21:00:00-03'::timestamp with time zone + ((cd.cal_start)::double precision * '00:00:01'::interval))), date_part('month'::text, ('1969-12-31 21:00:00-03'::timestamp with time zone + ((cd.cal_start)::double precision * '00:00:01'::interval))), r.name, (subplan), cu.cal_user_id, c.cal_title
         ->  Nested Loop Left Join  (cost=8.28..132.16 rows=1 width=180) (actual time=0.441..974.424 rows=160 loops=1)
               ->  Nested Loop  (cost=0.00..48.86 rows=1 width=179) (actual time=0.341..966.004 rows=149 loops=1)
                     Join Filter: (cr.cal_recur_date = COALESCE((subplan), 0::bigint))
                     ->  Nested Loop  (cost=0.00..38.71 rows=1 width=171) (actual time=0.123..19.732 rows=1105 loops=1)
                           ->  Nested Loop  (cost=0.00..35.84 rows=1 width=120) (actual time=0.106..5.790 rows=1105 loops=1)
                                 ->  Nested Loop  (cost=0.00..16.55 rows=1 width=112) (actual time=0.046..0.060 rows=1 loops=1)
                                       ->  Index Scan using egw_resources_pkey on egw_resources r  (cost=0.00..8.27 rows=1 width=116) (actual time=0.025..0.029 rows=1 loops=1)
                                             Index Cond: (res_id = 8522)
                                       ->  Index Scan using egw_categories_pkey on egw_categories ct  (cost=0.00..8.27 rows=1 width=4) (actual time=0.012..0.016 rows=1 loops=1)
                                             Index Cond: (ct.cat_id = r.cat_id)
                                             Filter: (cat_main = 133)
                                 ->  Index Scan using idx_egw_0001 on egw_cal_user cr  (cost=0.00..19.23 rows=4 width=21) (actual time=0.044..2.297 rows=1105 loops=1)
                                       Index Cond: (((r.res_id)::text = (cr.cal_user_id)::text) AND ((cr.cal_user_type)::text = 'r'::text))
                           ->  Index Scan using egw_cal_pkey on egw_cal c  (cost=0.00..2.86 rows=1 width=51) (actual time=0.004..0.006 rows=1 loops=1105)
                                 Index Cond: (c.cal_id = cr.cal_id)
                     ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates cd  (cost=0.00..1.86 rows=1 width=20) (actual time=0.013..0.526 rows=28 loops=1105)
                           Index Cond: (cd.cal_id = cr.cal_id)
                           Filter: ((date_part('year'::text, ('1970-01-01 00:00:00'::timestamp without time zone + ((cal_start)::double precision * '00:00:01'::interval))) = 2008::double precision) AND (date_part('month'::text, ('1970-01-01 00:00:00'::timestamp without time zone + ((cal_start)::double precision * '00:00:01'::interval))) = ANY ('{10,11,12}'::double precision[])))
                     SubPlan
                       ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates icd  (cost=0.00..8.28 rows=1 width=0) (actual time=0.005..0.006 rows=1 loops=30929)
                             Index Cond: ((cal_id = $2) AND (cal_start = $1))
                             Filter: (cal_start <> 0)
               ->  Index Scan using egw_cal_user_pkey on egw_cal_user cu  (cost=8.28..16.57 rows=1 width=21) (actual time=0.007..0.009 rows=1 loops=149)
                     Index Cond: ((cu.cal_id = cr.cal_id) AND (cu.cal_recur_date = COALESCE((subplan), 0::bigint)) AND ((cu.cal_user_type)::text = 'u'::text))
                     SubPlan
                       ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates icd  (cost=0.00..8.28 rows=1 width=0) (actual time=0.004..0.006 rows=1 loops=149)
                             Index Cond: ((cal_id = $2) AND (cal_start = $1))
                             Filter: (cal_start <> 0)
                       ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates icd  (cost=0.00..8.28 rows=1 width=0) (never executed)
                             Index Cond: ((cal_id = $2) AND (cal_start = $1))
                             Filter: (cal_start <> 0)
               SubPlan
                 ->  Bitmap Heap Scan on egw_categories ca  (cost=30.59..58.41 rows=10 width=50) (actual time=0.013..0.014 rows=1 loops=160)
                       Recheck Cond: ((cat_id)::text = ANY (string_to_array(($0)::text, ','::text)))
                       ->  Bitmap Index Scan on idx_egw_0005  (cost=0.00..30.59 rows=10 width=0) (actual time=0.008..0.008 rows=1 loops=160)
                             Index Cond: ((cat_id)::text = ANY (string_to_array(($0)::text, ','::text)))
 Total runtime: 979.685 ms
(40 registros)

--Almost the same thing on 8.3.5 (another hardware):
SELECT
 resource,
 category,
 userid,
 title,
 year,
 month,
 SUM(hours)
FROM
 (
  SELECT
   r.name AS resource,
   ARRAY(SELECT ca.cat_name FROM egw_categories ca WHERE ca.cat_id::text = ANY (string_to_array(c.cal_category, ','))) AS category,
   cu.cal_user_id AS userid,
   c.cal_title AS title,
   EXTRACT(year FROM (TIMESTAMP WITH TIME ZONE 'epoch' + cd.cal_start * INTERVAL '1 second')) AS year,
   EXTRACT(month FROM (TIMESTAMP WITH TIME ZONE 'epoch' + cd.cal_start * INTERVAL '1 second')) AS month,
   (cd.cal_end - cd.cal_start) * INTERVAL '1 second' AS hours
  FROM egw_cal_user cr
  JOIN egw_cal_dates cd
   ON
    cd.cal_id = cr.cal_id AND
    cr.cal_recur_date = COALESCE((SELECT cd.cal_start FROM egw_cal_dates icd WHERE icd.cal_id = cd.cal_id AND icd.cal_start = cd.cal_start AND icd.cal_start <> 0), 0)
  JOIN egw_resources r
   ON
    r.res_id::text = cr.cal_user_id AND
    cr.cal_user_type = 'r'
  JOIN egw_categories ct
   ON ct.cat_id = r.cat_id
  JOIN egw_cal c
   ON c.cal_id = cd.cal_id
  LEFT JOIN egw_cal_user cu
   ON
    cu.cal_id = cr.cal_id AND
    cu.cal_user_type = 'u' AND
    cu.cal_recur_date = COALESCE((SELECT cd.cal_start FROM egw_cal_dates icd WHERE icd.cal_id = cd.cal_id AND icd.cal_start = cd.cal_start AND icd.cal_start <> 0), 0)
  WHERE
   ct.cat_main = 133 AND
   r.res_id = 8522 AND
   cu.cal_user_id = '278827' AND                                                           
   EXTRACT(year FROM (TIMESTAMP 'epoch' + cd.cal_start * INTERVAL '1 second')) = 2008 AND
   EXTRACT(month FROM (TIMESTAMP 'epoch' + cd.cal_start * INTERVAL '1 second')) IN (10,11,12)
 ) foo
GROUP BY
 resource,
 category,
 userid,
 title,
 year,
 month
ORDER BY
 year,
 month,
 resource,
 category,
 userid,
 title;
                                                                                                                                                                                          QUERY PLAN                                                                                                                                                                                          
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 GroupAggregate  (cost=131.17..215.53 rows=1 width=175) (actual time=3179750.197..3179750.747 rows=4 loops=1)
   ->  Sort  (cost=131.17..131.18 rows=1 width=175) (actual time=3179749.897..3179750.007 rows=64 loops=1)
         Sort Key: (date_part('year'::text, ('1969-12-31 21:00:00-03'::timestamp with time zone + ((cd.cal_start)::double precision * '00:00:01'::interval)))), (date_part('month'::text, ('1969-12-31 21:00:00-03'::timestamp with time zone + ((cd.cal_start)::double precision * '00:00:01'::interval)))), r.name, ((subplan)), cu.cal_user_id, c.cal_title
         Sort Method:  quicksort  Memory: 33kB
         ->  Nested Loop  (cost=0.01..131.16 rows=1 width=175) (actual time=155178.467..3179744.010 rows=64 loops=1)
               Join Filter: ((cr.cal_recur_date = COALESCE((subplan), 0::bigint)) AND (cu.cal_recur_date = COALESCE((subplan), 0::bigint)))
               ->  Nested Loop  (cost=0.01..29.25 rows=1 width=187) (actual time=0.274..55246.217 rows=511222 loops=1)
                     ->  Nested Loop  (cost=0.01..27.36 rows=1 width=140) (actual time=0.255..13234.191 rows=511222 loops=1)
                           ->  Nested Loop  (cost=0.01..24.85 rows=1 width=122) (actual time=0.226..126.224 rows=1093 loops=1)
                                 ->  Nested Loop  (cost=0.01..16.57 rows=1 width=126) (actual time=0.192..20.013 rows=1093 loops=1)
                                       ->  Index Scan using egw_resources_pkey on egw_resources r  (cost=0.00..8.27 rows=1 width=118) (actual time=0.055..0.061 rows=1 loops=1)
                                             Index Cond: (res_id = 8522)
                                       ->  Index Scan using idx_egw_0001 on egw_cal_user cr  (cost=0.01..8.28 rows=1 width=18) (actual time=0.093..9.802 rows=1093 loops=1)
                                             Index Cond: (((cr.cal_user_id)::text = (r.res_id)::text) AND ((cr.cal_user_type)::text = 'r'::text))
                                 ->  Index Scan using egw_categories_pkey on egw_categories ct  (cost=0.00..8.27 rows=1 width=4) (actual time=0.064..0.077 rows=1 loops=1093)
                                       Index Cond: (ct.cat_id = r.cat_id)
                                       Filter: (ct.cat_main = 133)
                           ->  Index Scan using egw_cal_user_pkey on egw_cal_user cu  (cost=0.00..2.49 rows=1 width=18) (actual time=0.138..5.611 rows=468 loops=1093)
                                 Index Cond: ((cu.cal_id = cr.cal_id) AND ((cu.cal_user_type)::text = 'u'::text) AND ((cu.cal_user_id)::text = '278827'::text))
                     ->  Index Scan using egw_cal_pkey on egw_cal c  (cost=0.00..1.89 rows=1 width=47) (actual time=0.044..0.052 rows=1 loops=511222)
                           Index Cond: (c.cal_id = cr.cal_id)
               ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates cd  (cost=0.00..1.02 rows=1 width=20) (actual time=0.108..4.281 rows=30 loops=511222)
                     Index Cond: (cd.cal_id = cr.cal_id)
                     Filter: ((date_part('year'::text, ('1970-01-01 00:00:00'::timestamp without time zone + ((cd.cal_start)::double precision * '00:00:01'::interval))) = 2008::double precision) AND (date_part('month'::text, ('1970-01-01 00:00:00'::timestamp without time zone + ((cd.cal_start)::double precision * '00:00:01'::interval))) = ANY ('{10,11,12}'::double precision[])))
               SubPlan
                 ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates icd  (cost=0.00..8.28 rows=1 width=0) (actual time=0.029..0.035 rows=1 loops=29520)
                       Index Cond: ((cal_id = $2) AND (cal_start = $1))
                       Filter: (cal_start <> 0)
                 ->  Index Scan using egw_cal_dates_pkey on egw_cal_dates icd  (cost=0.00..8.28 rows=1 width=0) (actual time=0.034..0.040 rows=1 loops=15158976)
                       Index Cond: ((cal_id = $2) AND (cal_start = $1))
                       Filter: (cal_start <> 0)
                 ->  Bitmap Heap Scan on egw_categories ca  (cost=31.29..84.29 rows=100 width=48) (actual time=0.127..0.131 rows=1 loops=64)
                       Recheck Cond: ((cat_id)::text = ANY (string_to_array(($0)::text, ','::text)))
                       ->  Bitmap Index Scan on idx_egw_0005  (cost=0.00..31.27 rows=100 width=0) (actual time=0.097..0.097 rows=1 loops=64)
                             Index Cond: ((cat_id)::text = ANY (string_to_array(($0)::text, ','::text)))
 Total runtime: 3179751.510 ms
(36 registros)

