【问题标题】:How to assign a value to a date depending on it in PostgreSQL?如何在 PostgreSQL 中根据日期为日期赋值?
【发布时间】:2020-09-03 23:16:55
【问题描述】:

我正在使用 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

【问题讨论】:

  • 不要在变量名和类型之间加逗号。你写了dia, datetime,去掉逗号。如果您有多个参数,则使用逗号分隔名称类型对:create function x(name varchar, age int, birthdate date)

标签: sql python-3.x postgresql sqlalchemy


【解决方案1】:

以下应该这样做:

create or replace function get_season(p_input date) 
  returns integer
as
$$
  select case 
           when extract(month from p_input) > 9 then extract(year from p_input)::int + 1
           else extract(year from p_input)::int 
         end % 100
$$
language sql
immutable;

条件extract(month from p_input) > 9 检查日期是否在 10 月或更晚,并返回下一年的值。

但是,我强烈建议不要使用两位数的年份。

【讨论】:

  • @Á.Garzón: get_season(dia, datetime) 定义了一个带有两个(未命名)参数的函数。第一个必须是dia 类型,第二个是datetime 类型——Postgres 中都不存在这些数据类型。你为什么不使用我回答中的函数定义?
  • 是的,是的,我有点着急。我已将其更改为get_season(dia date),因为它使我认为 datetime 不是有效类型。现在,问题是我的 date_column 中的数据类型......但是,当我像往常一样选择它时,python 告诉我这是 datetime.date 类型......
  • @Á.Garzón:您的专栏可能是timestamp。检查表的CREATE TABLE 语句。或者您正在使用的 SQL 客户端中的表定义
  • 我刚查了一下,类型是日期。
  • @Á.Garzón 请考虑提出一个新问题 - 从这里开始的“我如何从日期中提取一个月”变成了一个完全不相关的“$$ 在 pgsql 上意味着什么” ,通过其他不相关的数据类型查询和 python 编码错误。 SO 旨在成为“一个问题,N 个好答案”的 wiki,而不是“提出一个问题,然后将人们拖过一天中发生的每个不相关问题”的技术支持服务。人们会提供帮助,因为他们喜欢做什么,但应该作为 N 个问题提出,而不是对一个问题进行 N 次编辑
【解决方案2】:

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”,但这完全是上下文相关的,我敢肯定。他们看到了“季节”这个词

【讨论】:

  • 查看我对您问题的评论
猜你喜欢
  • 2021-12-29
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2019-03-12
相关资源
最近更新 更多