1

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";

また、Perl で比較を行うために、SQL を使用してタイムスタンプをエポック時間に変換しました。これがばかげた質問であり、日付/時刻機能を処理するためのより直接的で簡単な方法があることを願っています。ありがとう。

4

2 に答える 2

0

これを行う簡単な方法はありません。4 つの基本的なオプションがあり、どれを使用するかは、特定の状況によって異なります。

  1. ストアド プロシージャ内から 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};
    
  2. 必要な日付値を渡す SQL または plpgsql ストアド プロシージャで plperl SP をラップします。

    CREATE FUNCTION foo AS $$
        SELECT foo_pl(EXTRACT(...),EXTRACT(...),...)
    $$ LANGUAGE SQL;
    
  3. perl 内で手動で日付操作を行います。

    これはしばしば見苦しくなります (そして、そもそも日付操作モジュールが存在する理由です!) が、うるう年、タイム ゾーンなどが関係ない (タイム スパンに 1 時間または 1 日を追加するなど) 十分に単純な操作では機能する可能性があります。 )。

  4. DateTimeなどのより洗練された perl モジュールが必要です。

    これには通常、標準の plperl の代わりに plperlu を使用する必要があり、これにはセキュリティ上の懸念が伴う可能性があります。また、このような大きなモジュールをストアド プロシージャにロードしても、パフォーマンスが向上する可能性はほとんどありません。しかし、十分なシステム メモリがあり、plperlu のセキュリティ上の懸念 (この投稿では説明しません) に慣れている場合は、オプションになる可能性があります。

于 2015-08-07T16:58:56.213 に答える
0

ほとんどの Postgre データベース フレームワークは、Date および DateTime データ型を自動的に変換します。そして、それらの型を Postgres に挿入するときに、それらが自動的に変換されない場合、Postgres が常に理解できるのは UTC 形式です。

アップデート

その後のコメントによると、必要な操作の種類に関する質問には具体的なものがないため、十分に文書化された日付/時刻関数のリストのみを参照できます: Postgres Date/Time Functions and Operators

于 2015-08-06T23:38:16.147 に答える