首页 > 解决方案 > Postgres 睡眠时间被添加到总查询运行时而不是输出中

问题描述

我在 postgres 中创建了一个简单的函数来计算经过的时间(我们希望以秒为单位),如下所示。

CREATE OR REPLACE FUNCTION printelapsedtime_ts(startTm timestamp with time zone)
RETURNS interval AS $$
DECLARE 
  elapsedInt interval;
  timeNow TIMESTAMP WITh TIME ZONE;
BEGIN
  PERFORM PG_SLEEP(5);
  timeNow = now();
  elapsedInt = timeNow - startTm;
  raise notice 'ELAPSED TIME: % - %  = %', timeNow, startTm, elapsedInt;
  return elapsedInt;
END;
$$ LANGUAGE plpgsql

我添加 PG_SLEEP(5) 只是为了进行测试,以确保它应该在返回值之前增加 5 秒,但是当使用 执行时select printelapsedtime_ts(now()) ,我得到的是结果00:00:00而不是00:00:05下面是输出消息。

NOTICE:  ELAPSED TIME: 2021-08-30 09:23:02.688261+00 - 2021-08-30 09:23:02.688261+00  = 00:00:00

Successfully run. Total query runtime: 5 secs 106 msec.
1 rows affected.

此外,如果我使用 调用该函数select printelapsedtime_ts( now() - (50 ||' seconds')::interval),我将得到00:00:50以下消息的输出。

NOTICE:  ELAPSED TIME: 2021-08-30 07:53:51.867826+00 - 2021-08-30 07:53:01.867826+00  = 00:00:50

Successfully run. Total query runtime: 5 secs 67 msec.
1 rows affected.

这两种情况都表明我使用 PG_SLEEP(5) 引入的延迟没有被添加到结果中,而是被添加到Total query runtime

我还尝试使用纪元时间来计算差异,但它也以相同的方式工作。下面是修改后的功能

CREATE OR REPLACE FUNCTION printelapsedtime_ep(startTm double precision)
RETURNS integer AS $$
DECLARE 
  elapsedInt INT;
  timeNow DOUBLE PRECISION;
BEGIN
  PERFORM PG_SLEEP(5);
  timeNow = extract(epoch from current_timestamp);
  elapsedInt = (timeNow - startTm)::INT;
  raise notice 'ELAPSED TIME: % - %  = %', timeNow, startTm, elapsedInt;
  return elapsedInt;
END;
$$ LANGUAGE plpgsql

我不确定我在哪里犯错。因为我在编写函数之前尝试了以下查询,它似乎工作正常。

查询select now() endtm, now() - (50 ||' seconds')::interval begintm给出以下输出:

 endtm                          | begintm
--------------------------------+---------------------------------
2021-08-30 08:57:23.531611+00   |  2021-08-30 08:56:33.531611+00

并且查询select extract(epoch from now()) endtm, (extract(epoch from now()) - 10)::int begintm给出以下输出

endtm      | begintm
-----------+------------
1630313468 | 1630313458

我想知道是否有任何 Postgres 函数可用于计算时差。我PostgreSQL 11.11, compiled by Visual C++ build 1800, 64-bit在 Azure 云即服务上使用

标签: postgresqlplpgsql

解决方案


推荐阅读