【问题标题】:postgres cast | convert interval to iso_8601 formatpostgres 演员 |将区间转换为 iso_8601 格式
【发布时间】:2016-01-22 13:37:55
【问题描述】:

在 pg 中月份可以是 'mon' 或 'month' 在 php 中'mon' 是星期一。

myinterval 是 db 上的一个区间列。

如何让pg输出

`SELECT myinterval FROM table` = 1 year 6 mons

`SELECT myinterval FROM table` = P1Y6M

我阅读了有关 intervalstyle 的信息,但我正在使用现有代码,所以我不能弄乱某些行,使用 intervalstyle 它会在整个会话中改变

【问题讨论】:

  • 我想知道为什么您的第一行与解决查询相关?
  • 因为如果你将它提供给 php,它将计算 1 年零 6 个星期一而不是 1 年零 6 个月,我可以将 'mon' 或 'month' 传递给 pg,但来自 pg 的所有响应都是'星期一'。 'P1YM' 这是 php 如何处理间隔'1 年和 6 个月的时间段'
  • 但这无关紧要。 postgres 无论如何都会返回一个字符串
  • 可以,但是是php能理解的字符串。
  • 如果担心给整个引擎设置默认,也可以per database and/or per rolelevel。

标签: php postgresql datetime iso8601


【解决方案1】:

很抱歉这么晚才回答这个问题,但我刚刚在我的旧代码库中遇到了同样的问题。我通过使用事务并在事务期间设置间隔样式解决了这个问题:

BEGIN;

SET LOCAL intervalstyle = 'iso_8601';
SELECT (INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second')::text;

COMMIT;

这会输出P6Y5M4DT3H2M1S

如果我之后直接运行:

SELECT (INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second')::text;

然后我得到6 years 5 mons 4 days 03:02:01

因此会话的间隔样式不受影响。

【讨论】:

    猜你喜欢
    • 2013-07-29
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2021-11-30
    • 2014-12-31
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多