データベースって、レコードをinsertした日時から、更新した日時はほぼ必ず登録しているケースが多いですが、
その他にも、経理データなどであれば、経費を使った日付などを登録していると思います。
そんな時に、登録開始をした最初の日付と最新の日付を取得する処理を作る必要があったので、その時硬いSQLのクエリコードを備忘録しておきます。
テーブル内の一番
普通に、yyyy-mm-ddのような形式で登録されていると、ORDER BYで簡単に取り出せるんですが、今回は、yearとmonthが別カラムに登録されているケースだったので、ちょっとした技が必要でした。
yyyy-mm-dd形式で登録されている場合は、ORDER BYで簡単に取り出せる。
# テーブル名 : sample_1
id |
date |
memo |
1 |
2020-01 |
作業1 |
2 |
2019-12 |
作業2 |
3 |
2023-05 |
作業3 |
4 |
2023-06 |
作業4 |
SELECT
MIN(date) as min,
,MAX(date) as max
FROM sample_1
MIN : 一番小さい値を取得
MAX : 一番大きい値を取得
# 結果
{
min : 2019-12,
max : 2023-06
}
yearとmonthが別カラムの場合
次にyearとmonthが別れていると何の問題があるかというと、それぞれ別々の値でのMINとMAXが取得されてしまいます。
ということで、year-monthの様に文字列連結を行ってから、MIN,MAX処理を行います。
そしてこのデータにはもう一つ問題点があって、monthが整数値で登録されているため、01のように、ゼロパディング(ゼロ埋め処理)しなければいけません。
# テーブル名 : sample_2
id |
year |
month |
memo |
1 |
2020 |
1 |
作業1 |
2 |
2019 |
12 |
作業2 |
3 |
2023 |
5 |
作業3 |
4 |
2023 |
6 |
作業4 |
SELECT
MIN(year || "-" || substr("0" || month, length(month), 3)) as min
,MAX(year || "-" || substr("0" || month, length(month), 3)) as max
FROM sample_2
ちょっと願いですが、次のような仕組みです。
ゼロパディング
substr("0" || month, length(month), 3)
文字列連結(yearとmonthを-(ハイフン)区切りで連結
year || "-" || month
# 結果
{
min : 2019-12,
max : 2023-06
}