【问题标题】:PostgreSQL - Truncating A Date Within Age FunctionPostgreSQL - 在年龄函数中截断日期
【发布时间】:2013-06-04 02:50:29
【问题描述】:

我有以下疑问:

SELECT usersid as user,
(age(creationtime)) as account_days
FROM users

输出用户(整数)和 account_days,它使用时间戳输出年龄(即 58 天,2:31:31.387746)。

我希望输出只是说 58,而不是 58 天,2:31:31.387746。我该怎么办?我试过了

SELECT usersid as user,
EXTRACT(day FROM(age(creationtime))) as account_days
FROM users

但它会将输出更改为不匹配的数字。

我在 x86_64-unknown-linux-gnu 上使用 PostgreSQL 9.2.4 版本,由 gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 编译,64 位

【问题讨论】:

    标签: sql postgresql truncate


    【解决方案1】:

    听起来您想查看justify_interval()date_trunc()

    denis=# select justify_interval(date_trunc('day', '58 days, 2:31:31.387746'::interval));
     justify_interval 
    ------------------
     1 mon 28 days
    (1 row)
    

    http://www.postgresql.org/docs/current/static/functions-datetime.html

    【讨论】:

    • 值得注意的是,函数列表(表9-27)没有提到date_truncdate_trunc(text, interval)形式,它只列出了date_trunc(text, timestamp)版本。不过,第 9.9.2 节中的完整文档确实提到了这两种形式。我刚刚向 pgsql-docs 邮件列表发送了一条关于该问题的说明,因此希望它会很快得到修复。
    • @denis 谢谢,我确实使用了与您上面的帖子类似的东西,但它输出 58 天,0:00:00。我真正想做的是阅读 58. 有什么想法吗?当我使用间隔时,它说 ERROR: cannot cast type timestamp with timezone to interval
    • @Stuave:在这种情况下,不要使用justify_interval()select date_trunc('day', '58 days, 2:31:31.387746'::interval)
    【解决方案2】:

    日期减法

    您可以通过将两个操作数转换为 date 然后相减来获得天数,而不是使用返回合理间隔的 age 函数:

    SELECT current_date - creationtime::date
    FROM ...
    WHERE ...
    

    部分天数将向下舍入并返回整数天数。

    例如:

    select current_date - (current_timestamp - INTERVAL '1 month 28 days, 2:31:31.387746')::date;
    

    to_charDDD 格式说明符

    或者,您可以使用to_char 的格式说明符DDD,并使用FM 格式修饰符来删除前导零:

     select to_char(age( current_timestamp - INTERVAL '1 month 28 days, 2:31:31.387746'), 'FMDDD');
    

    这仍然有效> 1年:

    regress=> select to_char(age( current_timestamp - INTERVAL '8 year 1 month 28 days, 2:31:31.387746'), 'FMDDD');
     to_char 
    ---------
     2936
    (1 row)
    

    【讨论】:

      【解决方案3】:

      只是需要类似的东西,解决方案应该是:

      SELECT (NOW()::date - creationtime::date) AS account_days FROM users
      

      输出是一个整数

      【讨论】:

      • NOW()::date 可以替换为更简单的current_date
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多