#はじめに
SQLで月別月初10日間だけのデータだけを抽出する方法について書きます。
月別だけなら参考記事がたくさんあるのですが、月初10日間だけの抽出方法についての記事が見つからなかったので、自分用のメモも含め共有します。
#データ
以下のデータを例にします
user_id | visited_date |
---|---|
1 | 2020-10-03 11:43 |
2 | 2020-11-02 11:49 |
2 | 2020-11-03 17:22 |
3 | 2020-11-09 15:21 |
3 | 2020-11-11 09:32 |
3 | 2020-11-20 20:30 |
取り出したいデータが各月の月初10日までのデータなので以下が取り出したいデータで抽出できればOKです
user_id | visited_date |
---|---|
1 | 2020-10-03 11:43 |
2 | 2020-11-02 11:49 |
2 | 2020-11-03 17:22 |
3 | 2020-11-09 15:21 |
#抽出方法
実際のコードがこちらです
SELECT *
FROM visit_log
WHERE to_char(visited_date, 'YYYY-MM-DD') <= concat(to_char(visited_date, 'YYYY-MM'), '-10')
and to_char(visited_date, 'YYYY-MM-DD') >= concat(to_char(visited_date, 'YYYY-MM'), '-00')
#解説
2020年10月といったような特定の月だけの月初10日間のデータ抽出なら
SELECT *
FROM visit_log
WHERE visited_log <= '2020-10-00 00:00:00'
and visited_log >= '2020-10-10 00:00:00'
で十分ですが、何ヶ月にも渡ってデータを抽出したいならWHERE文を一般化しなくてはいけません。
まずはto_charでDATETIME型からDATE型に変換します。
比較の部分では、'YYYY-MM-00' <= 'YYYY-MM-10' の範囲で月初10日間だけで条件付けしたいのでconcat関数でくっつけます。
すると一般化したWHERE文ができます。
月初7日間だけにしたいならconcat関数の部分をconcat(to_char(visited_date, 'YYYY-MM'), '-07')
に変更するだけでOKです。
#追記
SELECT *
FROM visit_log
WHERE EXTRACT(days from visited_date) <= 10
こちらのコードで十分でした。ご指摘していただいた@youmil_rainさんありがとうございます。