エンジニ屋.com(エンジニヤドットコム)

分かりやすくを意識して情報発信!

【MySQL】時間を除いて日付のみで絞り込み【SQL文】

例えば、下記のような受注データがあるとします。
日付ごとの支払い金額を算出したいと思い、単純にGROUP BY "出荷日時"ですると、時分秒まで一致しているかどうかを見てしまい、日時別で算出されてしまいます。
では、年月日が一致した合計金額を算出したいときは、どうすれば良いのでしょうか。そちらを紹介したいと思います。

サンプルデータ
テーブル名:dtb_order

受注ID 支払い金額 出荷日時
1 1,200 2021/11/30 10:00:40
2 2,200 2021/11/29 09:10:45
3 1,000 2021/10/20 08:20:30
4 1,500 2021/10/20 10:25:30
5 300 2021/10/29 09:10:45

このように数少ないデータであれば、暗算で可能ですが、実際の開発現場では、1000件以上もの受注データがあります。 MySQLでSQL文を実行すればサクッと必要なデータの抽出が可能です。

DATE_FORMAT

結論から言うと、日付だけで絞込むには、DATE_FORMATという関数を使います。
例を出す前に先ずは、単純にGROUP BYを使用した時の結果を見ていきたいと思います。

GROUP BY <カラム名>

SELECT o.支払い金額、 o.出荷日時
FROM dtb_order  as o
GROUP BY o.出荷日時
  • 結果
支払い金額 出荷日時
1,200 2021/11/30 10:00:40
2,500 2021/11/29 09:10:45
1,000 2021/10/20 08:20:30
1,500 2021/10/20 10:25:30

11/29 09:10:45の支払い金額のみグループ化されています。 10/20 はそれぞれ別々で支払い金額が出力されました。

GROUP BY DATE_FORMAT(<カラム名>,<フォーマット>)

SELECT o.支払い金額、 o.出荷日時
FROM dtb_order  as o
GROUP BY DATE_FORMAT(o.出荷日時,'%Y-%m-%d')
  • 結果
支払い金額 出荷日時
1,200 2021/11/30 10:00:40
2,500 2021/11/29 09:10:45
2,500 2021/10/20 08:20:30

10/20がまとまって、思い通りのデータが出力されました。

DATE_FORMATですが、指定したカラムの日付のフォーマットを替えることができます。 DATE_FORMAT(o.出荷日時,'%Y-%m-%d')をすることにより、年月日までの値に変更して、GROUP BYでまとめました。

Tips

ちなみに出力される日付よりも後ろの時間は、最初に通るレコードの値です。 後ろの時間を非表示にしたい場合は、**SELECT** にDATE_FORMAT(o.出荷日時,'%Y-%m-%d')を指定すると表示が日付のみになります。

以上となります。 Have a nice development day~~!