[SQLite] 登録されているレコードデータの中で一番古い年月の取り出し方

データベースって、レコードを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 }