PostgreSQLでtimestampから経過日数(整数)を計算する

  • PostgreSQL
  • SQL

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

created_atのようなtimestampカラムから、現在までの経過日数を整数で出したい場面がよくある。時刻は無視して「何日経ったか」だけ知りたいケース。

やり方

SELECT
id,
created_at,
CURRENT_DATE - created_at::DATE AS elapsed_days
FROM
your_table_name;

created_atを::DATEで日付型にキャストしてから、CURRENT_DATEとの差を取るだけ。

なぜこれで整数になるか

PostgreSQLではdate型同士の引き算はintervalではなく、日数を表すintegerを返す。これは他の型(timestamp同士やinterval絡みの引き算)とは違う挙動で、date - dateの場合だけ特別に整数が返ってくる。

だからcreated_at::DATEで時刻を切り捨ててから引けば、余計な変換をしなくてもそのまま日数の整数値が手に入る。

時刻を無視していい点に注意

created_at::DATEにキャストする時点で時刻部分は切り捨てられる。例えばcreated_atが「昨日の23:59」でも、CURRENT_DATEとの差はきっちり1日としてカウントされる。時刻まで含めた精度が必要な場合はこの方法では合わない(その場合は別途timestamp同士の引き算が必要になる)。