2014/07/22
PostgreSQL
 >  トランザクション内での時刻取得
2014/07/15 での PC 画面録画の例に、PostgreSQL で一秒おきに now() を表示する例を載せた。now() はトランザクション開始時刻を返すので、何秒たっても表示時刻が変わらない。一方、別の関数 clock_timestamp() または timeofday() を使えばトランザクション内でも実際の時刻が得られる。実行環境は 2014/04/17 を参照。初めに now() の動画を再掲。




↓ 次に clock_timestamp() を使った例。psql でもいいが、上との区別を兼ね、いつも使っている pgAdmin III のクエリツールで。
DO $$
DECLARE i int ;
BEGIN
FOR i IN 1..10 LOOP
RAISE INFO '%', clock_timestamp() ;
PERFORM pg_sleep(1) ;
END LOOP ;
END $$ ;



↓ 日本語ドキュメント。トランザクション内で実時刻を得られる関数 clock_timestamp() と timeofday() の違いについても分かる。後者も動画で示す。

■ PostgreSQL 9.3.2文書 : 日付/時刻関数と演算子 : Current Date/Time
http://www.postgresql.jp/document/9.3/html/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT
clock_timestamp()は実際の現在時刻を返しますので、その値は単一のSQLコマンドであっても異なります。 timeofday()はPostgreSQLの歴史的な関数です。 clock_timestamp()同様、実際の現在時刻を返しますが、timestamp with time zone型の値ではなく、整形されたtext文字列を返します。



コード内にある pg_sleep(1) ; で一秒待っている。PL/pgSQL の無名コードブロック内なので SELECT でなく PERFORM を使う。日本語ドキュメントの URL は先ほどと同じ。

■ PostgreSQL 9.3.2文書 : 日付/時刻関数と演算子 : 遅延実行
http://www.postgresql.jp/document/9.3/html/functions-datetime.html#FUNCTIONS-DATETIME-DELAY
pg_sleepは、seconds秒経過するまで、現在のセッションのプロセスを休止させます。secondsはdouble precision型の値です。 そのため、小数単位で休止秒数を指定することができます。
(中略)
注意: 休止時間の有効な分解能はプラットフォームに依存します。0.01秒が一般的な値です。遅延は少なくとも指定した通り行われます。サーバの負荷が要因となり、より長くなる可能性があります。
<< pgAdmin のクエリツールを電卓代わ…
階級幅だけ決めてヒストグラムを描く >>
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。