created: 2019-03-16T08:00:00.000Z

PostgreSQLで特定期間の日数/時間数などを数える

PostgreSQLで特定期間の日数や時間数などを計算したいときの、計算方法メモ

date型の場合

そのまま引き算すると整数で日数が出る

select cast('2019-01-01' as date) - cast('2018-12-01' as date)
31

timestamp型の場合

そのまま引き算するとinterval型で日数(や時間数)が出る。 ぴったり期間がぴったりXX日じゃなく、XX日とX時間、みたいなときは時間数も出る。

select cast('2019-01-01 00:00:00' as timestamp) - cast('2018-12-01 12:00:00' as timestamp)
30 days, 12:00:00

日数を出したい場合1: epoch from で秒数から割り戻す

秒での引き算に直した後、日数に割り戻して小数点以下を切り捨てる。

select trunc((extract(epoch from cast('2019-01-01 00:00:00' as timestamp)) - extract(epoch from cast('2018-12-01 12:00:00' as timestamp))) / 60 / 60 / 24)
30.00

日数を出したい場合2: extract で日数だけを取り出す

interval型から、日数のみ取り出す。

select extract('day' from (cast('2019-01-01 00:00:00' as timestamp) - cast('2018-12-01 12:00:00' as timestamp)))
30.00

参考

  • http://m6u.hatenablog.com/entry/2017/01/12/115633
  • https://www.postgresql.jp/document/10/html/datatype-datetime.html
  • https://www.postgresql.jp/document/10/html/functions-datetime.html