首页 > 解决方案 > 如何在 PostgreSQL 中根据日期为日期赋值?

问题描述

我正在使用 PostgreSQL 并想创建一个函数并在同一个查询中使用它。我要创建的函数应该与以下 python 函数相同:

def get_season(dia):

    season = (abs(dia.year) % 100) + (1 if dia.strftime('%m-%d') >= '10-01' else 0)
    return season

给定一个日期时间,该函数返回其年份的最​​后两位数字,或者如果日期大于 10 月的第一个数字,则返回前一个数字加 1,例如:

输入 = '2017-3-5' -> 输出 =17

输入 = '2019-11-1'-> 输出 =20

问题是我不知道在 PostgreSQL 中使用什么函数来做到这一点。

目前,我正在使用以下代码,但会抛出错误:

    CREATE FUNCTION get_season(dia, datetime) RETURNS integer AS $$
    BEGIN
    MOD(EXTRACT(year FROM dia), 100) + 
    CASE WHEN EXTRACT(MONTH FROM dia) >= 10 THEN 1 ELSE 0 END;
    END $$
    LANGUAGE PLPGSQL;

    SELECT date_column, get_season(date_column)
    FROM my_table

错误抛出是:(psycopg2.errors.UndefinedObject) dia type doesn't exist

标签: sqlpython-3.xpostgresqlsqlalchemy

解决方案


postgres EXTRACT 函数将提取日期的一部分,因此我想您可以制作如下内容:

MOD(EXTRACT(year FROM yourdate), 100) + 
CASE WHEN EXTRACT(month FROM yourdate) > 9 THEN 1 ELSE 0 END

第一个获取两位数的日期,第二个获取 0 或 1 以添加取决于月份

ps; 我不确定我是否会称这样的函数为“get_season”,一年有 4 个季节等 - 也许是“get_academic_year”,但这完全是上下文相关的,我敢肯定。他们看到了“季节”这个词


推荐阅读