【问题标题】:How to use PostgreSQL to calculate the completion time of two timestamp records?PostgreSQL如何计算两条时间戳记录的完成时间?
【发布时间】:2020-02-11 17:29:41
【问题描述】:

我有一个包含以下字段的邀请表:

Invitations: id, created_at, completed_at

我正在编写一个 PostgreSQL 查询,该查询按每周群组(过去 7 天)分解数据并显示平均完成时间(created_at 和 completed_at 之间的天数差异)。仅供参考,completed_at 可能为 null,表示未完成。

这是我目前所拥有的:

SELECT  TRUNC(DATE_PART('day', CURRENT_DATE - i.created_at )/7)  AS weeks_ago,
                date(min(i.created_at)) AS "Date Start",
                date(max(i.created_at)) AS "Date End",
                count(DISTINCT i.id) AS "Total Num Invites",
                TIMESTAMPDIFF('day', i.created_at, i.completed_at)    
FROM invitations i
GROUP BY weeks_ago
ORDER BY weeks_ago ASC;

这是错误的:

ERROR:  function timestampdiff(unknown, timestamp without time zone, timestamp without time zone) does not exist
LINE 5:     TIMESTAMPDIFF('day', i.created_at, i.completed_at)
            ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
, Time: 0.085000s

我正在使用 PostgreSQL,我在这里做错了什么?

【问题讨论】:

  • 我在这里做错了什么?也许调用了一个不存在的函数?

标签: sql postgresql


【解决方案1】:

TIMESTAMPDIFF 不是 PostgreSQL 的自然属性。见这里:Postgresql date/time functions

在 PostgreSQL 中,日期操作类似于数字操作。

例子:

SELECT '2020-01-05 00:01:05'::timestamp - '2020-01-02 00:05:05'::timestamp
-- you get: 2 days 23:56:00

所以,要模拟TIMESTAMPDIFF(SQL_TSI_DAY, i.created_at, i.completed_at),你必须这样做:

DATE_PART('day', i.completed_at - i.created_at)

使用前面的示例:

SELECT DATE_PART('day', '2020-01-05 00:01:05'::timestamp-'2020-01-02 00:05:05'::timestamp)
-- you get: 2

【讨论】:

    【解决方案2】:

    您最大的提示是ERROR: function timestampdiff(unknown,。这告诉您它不知道您为函数提供的值是什么数据类型。 TIMESTAMPDIFF() 要求第一个参数是定义的常量列表之一。在您的情况下是 SQL_TSI_DAY,例如:

    TIMESTAMPDIFF(SQL_TSI_DAY, i.created_at, i.completed_at)
    

    This link 可能会有所帮助。它提供了有关 TIMESTAMPDIFF() 函数的一些详细信息。

    编辑:替换了上面的链接。我发布的第一个链接有一些拼写错误和不正确的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多