postgresql - 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 云即服务上使用
解决方案
推荐阅读
- reactjs - 蓝色按钮而不是紫色
- synapse - 无法在 :::8008 上收听:[Errno 97] 协议不支持地址系列
- c++ - 如何在 configure 和 makefile.am 中包含他的 C++ mysql 库?
- elixir - Elixir Jason 用元组编码结构
- mvvm - 如何在回收站视图中表示父/子结构?
- node.js - 升级到节点 12 后 npm sqlite3 库出错 - 未找到 GLIBCXX_3.4.21'
- mysql - 生产环境创建MySQL数据表OK
- angular - ngx-translate 也翻译给定的参数
- hadoop - 使用 NiFi 将 CSV 数据摄取到 Hive
- php - 字符串在 URL opencart 链接上转换为数组