助け合いフォーラム
この問題はプレミアムコンテンツです。
現在の時刻を取得するSQL文について
問題ID:35230
現在の時刻を取得するSQL文はどれか。
選択肢
①SELECT current_database();
②SELECT now();
③SELECT current_date;
④SELECT current_timestamp;
⑤SELECT current_time;
回答としては⑤となっていますが、解説では現在時刻ではなく「現在のトランザクションの開始時刻」となっているので、適当ではない認識です。
「現在のトランザクション開始時刻」を出力して正解になるのであれば、②、④も日付と合わせて時刻も出力しているので、こちらも正解になると考えられます。(問題の中では時刻「のみ」とは言及していない。)
ただ、題意を純粋に読み取れば、トランザクションにかかわらず現在の時刻を取得するSQL文を求められていると読み取れるので、上記の中には正解が存在しないのではないでしょうか。
解説を読む限り、トランザクションにかかわらず現在の時刻を出力してくれるSQL文は以下となる認識です。
SELECT clock_timestamp();
確かに正答選択肢とされているものが設問の要件に合っているかというと疑問ですね。トランザクション中だったら current_time
が返すものは固定になるみたいですし。
psql (14.17 (Debian 14.17-1.pgdg120+1))
Type "help" for help.
postgres=# begin;
BEGIN
postgres=*# select current_time;
current_time
--------------------
10:16:17.821625+00
(1 row)
postgres=*# select current_time;
current_time
--------------------
10:16:17.821625+00
(1 row)
postgres=*#
解説を読む限り、トランザクションにかかわらず現在の時刻を出力してくれるSQL文は以下となる認識です。
SELECT clock_timestamp();
解説からすると statement_timestamp()
でも良さそうですね。データ型が TIME じゃないのでダメって言われるかもですが 😅
postgres=# begin;
BEGIN
postgres=*# select statement_timestamp();
statement_timestamp
-------------------------------
2025-04-04 10:17:43.929427+00
(1 row)
postgres=*# select statement_timestamp();
statement_timestamp
-------------------------------
2025-04-04 10:17:51.674181+00
(1 row)
postgres=*#
コメント
実際の試験でどのように出題される可能性があるかまではわかりませんが、解説のとおり「current_time」は「トランザクションの開始時刻」の方が正確な説明ですよね。
ちなみに、「時刻」なのか「日時」なのか、「日時」には「時刻」も含まれるではないか、という点については、こういう試験では「より適切な選択肢」が正当となることが多い気がするので、問題文が「現在の時刻を取得する」なので、「current_timestamp」と「current_time」が選択肢にあって正答を一つ選ぶ問題であれば「current_time」の方が正答になると考えておいた方が無難かなとは思います。
この辺は過去にもフォーラムで議論があったみたいです。
https://mondai.ping-t.com/g/posts/1444
コメント
この投稿に対して返信しませんか?
v van2houten4
2025/04/07 09:52
コメントありがとうございます。 postgreSQLの日本語公式ドキュメント、表9.33 日付/時刻関数演算子によると、current_timeの説明部分が[現在の時刻。]のみになっているので、ここから問題を作っていると仮定すると、適当なものはcurrent_timeになりそうだな、と思いました。 ただ、current_timestampなどの説明は[現在の日付と時刻(現在のトランザクションの開始時)。]となっており、トランザクション開始時で固定されることを明記しているものもあるので、公式ドキュメント側の説明不足もありそうです。 表9.33にはトランザクションによらずtime型を返してくれそうなSQL文がないので、適当な解答はやはり存在しないのかなと思います。 あまり納得はいきませんでしたが、公式ドキュメントよりcurrent_timeが正答、でいったんオチをつけたいと思います。。