作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在用 plperl 编写 Postgres 函数(存储过程)时,我了解到无法加载诸如“use Time::Piece;”之类的 perl 模块。鉴于此,在 plperl 中处理日期/时间操作和比较的最佳方法是什么?使用 plperlu 和加载模块不是我的选择。
我不得不诉诸如下查询:
$query = "SELECT extract(day from timestamp '$eventDate') AS day,
extract(month from timestamp '$eventDate') AS month,
extract(year from timestamp '$eventDate') AS year";
我还使用 SQL 将时间戳转换为纪元时间,以便在 perl 中进行比较。我希望这是一个愚蠢的问题,并且有一种更直接、更简单的方法来处理日期/时间功能。谢谢。
最佳答案
没有一种简单的方法可以做到这一点。您有四个基本选项,使用哪个取决于您的具体情况。
在您的存储过程中使用 SQL。
这通常比我喜欢的更冗长,但它可能是最简单和最有效的。示例:
my $now = spi_exec_query('SELECT EXTRACT(epoch FROM NOW())')->{rows}[0]->{date_part}
|| die "Unable to determine current time";
或者一次有多个值:
my $row = spi_exec_query('SELECT EXTRACT(...) AS a,EXTRACT(...) AS b,... AS x')->{rows}
or die "Some useful message...";
my $a = $row->{a};
my $b = $row->{b};
...
my $x = $row->{x};
用 SQL 或 plpgsql 存储过程包装您的 plperl SP,它传递所需的日期值:
CREATE FUNCTION foo AS $$
SELECT foo_pl(EXTRACT(...),EXTRACT(...),...)
$$ LANGUAGE SQL;
在 perl 中手动进行日期操作。
这通常很丑陋(以及为什么日期操作模块首先存在!)但可能适用于足够简单的操作,其中闰年、时区等无关紧要(将一个小时或一天添加到一个时间跨度等)。
需要更复杂的 perl 模块,例如 DateTime .
这通常需要使用 plperlu,而不是标准的 plperl,这可能会带来一些安全问题。将如此大的模块加载到存储过程中也不太可能提高性能。但是,如果您有足够的系统内存,并且您对 plperlu 的安全问题感到满意(本文未涵盖),它可以是一个选择。
关于perl - 如何在 PostgreSQL PLPerl 函数中进行日期/时间操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31867343/
我是一名优秀的程序员,十分优秀!