1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQL 月別で月初10日だけの集計方法

Last updated at Posted at 2020-11-14

#はじめに
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さんありがとうございます。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?