【问题标题】:PostgreSQL error when using EXTRACT to get a unit使用 EXTRACT 获取单位时 PostgreSQL 错误
【发布时间】:2019-02-03 15:12:20
【问题描述】:

我一直在尝试从指定的时间戳中提取月份:

SELECT EXTRACT(MONTH FROM '2019-01-02 00:00:00+00');

但我收到以下错误:

错误:函数 pg_catalog.date_part(unknown, unknown) 不是唯一的 第 1 行:SELECT EXTRACT(MONTH FROM '2019-01-02 00:00:00+00'); ^ 提示: 无法选择最佳候选函数。您可能需要添加 显式类型转换。 SQL 状态:42725 字符:8

但是,当我使用指定 CURRENT_TIMESTAMP 变量的相同命令时,会返回预期的结果。

SELECT EXTRACT(MONTH FROM CURRENT_TIMESTAMP);

如何从我第一次尝试返回预期结果时获得该单位?

【问题讨论】:

    标签: database postgresql extract


    【解决方案1】:

    将字符串转换为时间戳:

    SELECT EXTRACT(MONTH FROM TIMESTAMP '2019-01-02 00:00:00+00');
    

    来自the documentation的片段:

    EXTRACT(field FROM source)

    (...) source 必须是时间戳、时间或 间隔。 (日期类型的表达式被转换为时间戳,并且可以 因此也可以使用。)

    【讨论】:

    • 啊,我没有意识到我必须明确地投射。我认为解释类型会足够聪明!谢谢:)
    【解决方案2】:

    在尝试通过适用于 C# 和 LINQ 的 Postgres 适配器运行类似查询时,我遇到了相同的错误消息。编译后的查询将DateTime 参数传递到EXTRACT(MONTH FROM ($1)) 之类的子句中,即使我的LINQ 查询是使用dateTime.Month 整数属性(例如dbRecord.created_date.month == myPOCO.created.Month)编写的。

    我能够通过将myPOCO.created.Month 拉出到一个单独的int 变量来绕过这个问题,这允许 SQL 引擎推断一个整数参数而不是日期时间,并在没有调用的情况下构建一个正确(并且更快)的语句到EXTRACTmyPOCO.created.Month

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多