我在这里看到了两种方法。
首先,join generate_series(start_date::timestamp,end_date,'12 hours'::interval) 算入那些generate_series。我相信这会更正确。但它有一个主要的缺点 - 你必须 lateral join 它针对现有数据集才能使用 min(time) 和 max(time)...
其次,猴子自己破解,但编码和查询要少得多。使用不同的时区以 12:00 为一天的开始,例如(您没有提供样本,所以我以 generate_series 生成县的内容,间隔 2 小时作为样本数据):
t=# with counties as (select generate_series('2017-09-01'::timestamptz,'2017-09-04'::timestamptz,'2 hours'::interval)
g)
select count(1),to_char(g,'MM/DD/YYYY') from counties
group by to_char(g,'MM/DD/YYYY')
order by 2;
count | to_char
-------+------------
12 | 09/01/2017
12 | 09/02/2017
12 | 09/03/2017
1 | 09/04/2017
(4 rows)
所以对于UTC 时区,由于我的示例中generate_series 的包容性,上述几天有 12 个两小时间隔行,最后几天有 1 行。一般:37 行。
现在是猴子黑客:
t=# with counties as (select generate_series('2017-09-01'::timestamptz,'2017-09-04'::timestamptz,'2 hours'::interval)
g)
select count(1),to_char(g at time zone 'utc+12','MM/DD/YYYY') from counties
group by to_char(g at time zone 'utc+12','MM/DD/YYYY')
order by 2;
count | to_char
-------+------------
6 | 08/31/2017
12 | 09/01/2017
12 | 09/02/2017
7 | 09/03/2017
(4 rows)
我为不同的时区选择相同的日期,准确地切换 12 小时,从 8 月 31 日中午开始,而不是 9 月 1 日午夜开始第一天,计数发生变化,仍然总计 37 行,但按您要求的方式分组......
更新
对于您的查询,我会尝试:
SELECT count(DISTINCT ltg_data.lat), cwa, to_char(time at time zone 'utc+12', 'MM/DD/YYYY')
FROM counties
JOIN ltg_data on ST_contains(counties.the_geom, ltg_data.ltg_geom)
WHERE cwa = 'MFR'
AND time BETWEEN '1987-06-01'
AND '1992-08-1'
GROUP BY cwa, to_char(time at time zone 'utc+12', 'MM/DD/YYYY');
如果您想将 +12 小时逻辑应用于 where 子句 - 也将 at time zone 'utc+12' 添加到“时间”比较中