PostgreSQL 按季节分组(北半球和南半球)

标签 postgresql date postgis between

我的数据点分布在全局各地。每个数据点都有一个时间戳。

我想按季节对数据进行分组,如下图所示(来源:https://en.wikipedia.org/wiki/Season#/media/File:Seasons1.svg)。

enter image description here

这是我迄今为止尝试过的(北半球 2011/2012 年冬季):

SELECT * FROM my_table 
    WHERE my_date BETWEEN '2011-12-21' AND '2012-03-21'
    AND ST_Y(ST_Centroid(geom)) > 0;

我怎样才能在所有可能的年份里做到这一点?我尝试过...或日期之间...但这非常慢。

如何才能同时选择北半球和南半球的冬天?

更新

对于北半球的所有冬季数据,我使用以下查询:

CREATE TABLE season_winter_north AS WITH first_step AS (
SELECT
    id,
    extract(month from my_date)::int AS month,
    extract(day from my_date)::int AS day,
    ST_Centroid(geom) AS geom
FROM mytable 
    WHERE ST_Y(ST_Centroid(geom)) > 0)

(SELECT * FROM first_step
    WHERE month = 12
        AND day >= 21)

UNION ALL

(SELECT * FROM first_step
    WHERE month = ANY('{1,2}'))

UNION ALL

(SELECT * FROM first_step
    WHERE month = 3
        AND day<21)

有更优雅或更高效的解决方案吗?

最佳答案

with t(my_date) as (
    values ('2012-07-01'::date), ('2013-03-30'), ('2013-10-12'), ('2013-01-10')
)
select 
    case 
        when my_date between 
            make_date(extract(year from my_date)::int, 3, 21)
            and
            make_date(extract(year from my_date)::int, 6, 20)
        then 'spring'
        when my_date between 
            make_date(extract(year from my_date)::int, 6, 21)
            and
            make_date(extract(year from my_date)::int, 9, 22)
        then 'summer'
        when my_date between 
            make_date(extract(year from my_date)::int, 9, 23)
            and
            make_date(extract(year from my_date)::int, 12, 20)
        then 'fall'
        else 'winter'
    end as season,
    my_date
from t
;
season |  my_date   
--------+------------
summer | 2012-07-01
spring | 2013-03-30
fall   | 2013-10-12
winter | 2013-01-10

关于PostgreSQL 按季节分组(北半球和南半球),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32393295/

相关文章:

sql - Postgres 复杂的全外连接保留 "on"列中的空值

python - 将奇怪的 Python 日期格式转换为可读日期

sql - 从两个数字构造几何类型

r - 使用 RPostgreSQL 列出数据库

postgresql - 如何转义postgresql中的一些字符

Mysql和日期函数,它是否对每一行进行处理?

postgresql - map 服务器错误 : FATAL: Ident authentication failed for user "..."

c++ - 如何在 libpqxx/C++ 准备好的 SQL 语句中将参数绑定(bind)在引号内

mysql - 为什么 zk/etcd 而不是 rdbms 用于集群协调

php - 如何使用 php 显示下周三的日期