【PostgreSQL】selectで時間の範囲を指定する方法

先日クエリを叩く際にある範囲での実行がしたいなぁ...って思ったことがありました。

それについてメモを...。

例えば以下に使う場合を想定します。

takapon-test=> select * from users;
 id |    name    |     email      |     created_at      |     updated_at
----+------------+----------------+---------------------+---------------------
  1 | Taka       | Taka@pon       | 2020-02-23 04:29:46 | 2020-02-23 04:29:46
  2 | Takapon    | Takapon@pon    | 2020-02-24 10:10:23 | 2020-02-25 08:20:16
  3 | Takapo---n | Takapo---n@pon | 2020-02-24 15:00:00 | 2020-02-27 12:45:34
(3 rows)

ビシッとある時間を指定したい場合

created_atが"2020-02-23 04:29:46"のものを抽出したい場合は以下。

select * from users where created_at = '2020-02-23 04:29:46';

単純にselectでカラムの値が一致した場合のみ取得する感じです。

任意の範囲で指定したい場合

一定の範囲で指定したい場合ももちろんできます。

例えば"created_at"カラムの値が'2020-02-23 04:29:40'から、 '2020-02-23 04:29:50'の範囲にあるものを指定したい場合は以下のようにすればOKです。

select * from users where created_at BETWEEN '2020-02-23 04:29:40' AND '2020-02-23 04:29:50';

簡単ですね!

"BETWEEN 始端時刻 AND 終端時刻"と指定してあげればいい感じにできます。

日付や時間で指定したい場合

時間まであるけどある日付だけのデータでいいんだよなぁ...っていう場合、ありません?

もともとそれがしたくて調べてたんですが、上記を応用すればこれも簡単にできます!

例えばcreateddayが"2020-02-23"のデータが欲しい場合は以下でできます。

select * from users where created_at BETWEEN '2020-02-23 00:00:00' AND '2020-02-23 23:59:59';

時間も書いてあげないといけないので、1日分の時間を書いてあげればいいわけです。

似たようにすれば1時間単位、1分単位、1年単位でも可能ですね。

ざっと書くと以下のようになると思います。

// 1分
select * from users where created_at BETWEEN '2020-02-23 12:00:00' AND '2020-02-23 12:00:59';

// 1時間
select * from users where created_at BETWEEN '2020-02-23 12:00:00' AND '2020-02-23 12:59:59';

// 1日
select * from users where created_at BETWEEN '2020-02-23 00:00:00' AND '2020-02-23 23:59:59';

// 1ヶ月
select * from users where created_at BETWEEN '2020-02-00 00:00:00' AND '2020-02-28 23:59:59';

// 1年
select * from users where created_at BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59';

まとめ

割と時間範囲でSQLをselectしたいことってあるとおもうんです。

何日〜何日までに障害出たから、その範囲で調べよう〜とか。

そんな時はbetweenを使いましょう!

それでわ!

おすすめの記事