先日クエリを叩く際にある範囲での実行がしたいなぁ...って思ったことがありました。
それについてメモを...。
例えば以下に使う場合を想定します。
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を使いましょう!
それでわ!