【问题标题】:Trimming trailing :00 from output after date_trunc在 date_trunc 之后从输出中修剪尾随 :00
【发布时间】:2019-11-26 17:05:54
【问题描述】:

我有以下 SELECT,我从表中减去两次以查看某项花费了多长时间。

SELECT finished-started AS duration FROM table;

这给了我类似 3 天 00:17:15.181635

的答案

然后我使用 date_trunc 因为我只关心分钟级别。

SELECT date_trunc('minute', finished-started) AS duration FROM table;

这给了我一个类似 3 days 00:17:00

的答案

有没有办法从末尾剪掉 :00 以便 SELECT 输出类似于 3 days 00:17 的内容?

【问题讨论】:

  • 可以使用to_char()格式化区间
  • 所以在你的列“finished-started”中只有这个值:“00:17:15.181635”?
  • 对不起,我不清楚。 Finished 和 Started 都是没有时区的时间戳列。所以我的 SELECT 减去它们并给我差异。这是示例输出: DBNAME=> select id, started, finished, finished-started as duration from tablename limit 1;编号 |开始|完成|持续时间 5 | 2019-09-06 18:16:50.773331 | 2019-09-06 18:28:08.109557 | 00:11:17.336226

标签: sql postgresql intervals


【解决方案1】:

使用rtrim():

您执行date_trunc(),将其转换为varcharrtrim() 结尾:00 部分:

SELECT 
    rtrim(date_trunc('minute', finished - started)::varchar(255), ':00') AS duration 
FROM table

使用to_char():

由于interval 类型的格式选项有限,因此有点令人费解。 您可以使用 'DD HH24:MI' 格式化语法,但它不会将 day/days 显示为单位(例如,您将获得 3 00:17)。如果没问题,您可以使用以下查询:

SELECT 
    to_char(date_trunc('minute', finished - started), 'DD HH24:MI') AS duration
FROM table

如果需要显示 day/days(例如 3 天 00:17),那么您需要手动“编程”它 - 如下所示:

SELECT  
    CASE
        WHEN EXTRACT(day from finished - started) < 1 THEN 
            to_char(date_trunc('minute', finished - started), 'HH24:MI')
        WHEN extract(day from finished - started) > 1 THEN 
            to_char(date_trunc('minute', finished - started), 'DD "days" HH24:MI')
        ELSE
            to_char(date_trunc('minute', finished - started), 'DD "day" HH24:MI')
    END AS duration
FROM table

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2014-11-29
    相关资源
    最近更新 更多