MYSQL で年、月、日をバラバラに取り出してみた
最近のホームページとMYSQLはほぼセットといっても過言ではありません。
なぜならば、情報発信媒体であるホームページに新しい情報を掲載する機能が不可欠だからです。
そんなこともあり、日々MYSQLの構文を頭をひねりながら考えています。
そんななか、日付の年、月、日をばらばらに取り出すことがありました。
具体的には該当年、該当月のデータを抽出する目的です。
日付データ(yyyy-mm-dd形式)から該当年データの抽出って、そのままだとできませんでした。
ググって四苦八苦しながら、対応できましたので忘備録として記録いたします。
今回やりたいことはMYSQLで日付を分割
日付を分割して取り出すことをやりたいと考えました。
つまり、MYSQL上に「2022-09-27」と保存されている場合、「2022」、「09」、「27」というように別々の情報として読み取ることをします。
DATE_FORMAT関数を使用すると日付を分割できます
MYSQLで日付データはを別々に取り出す方法がないかググってみたところ、DATE_FORMAT()関数を使えば実現できることがわかりました。
実際にやってみると、きちんと日付を分割することができました。
そのやり方について解説いたします。
前提1:MYSQLの構造とデータ
今回テストのためのデータは次の通りです。
テストなので、簡素な構造にしてあります。
テーブル名は「date_splits」です。
そのままデータを読む場合のSQL文
そのままデータを読む場合は次のように記述します。
1 2 |
SELECT date FROM date_split |
初歩的なSQL分です。
これを日付分割で読み取る場合は、次のように記述します。
日付を「年」「月」「日」ばらばらに読み取る場合のSQL文
日付を分割して読み取る場合は、次のように記述します。
1 2 3 |
SELECT DATE_FORMAT(date, '%Y') as year, DATE_FORMAT(date, '%c') as month, DATE_FORMAT(date, '%e') as day FROM date_split |
実行した結果
日付がばらばらに読み込みできました。
これで、年だけを照合したり、年+月での照合ができるようになりました。
DATE_FORMATについての補足
DATE_FORMAT()と言われると、何となく想像するのがPHPのDATE()関数です。
PHPで今回のようなことをする場合、次のように記述します。
1 2 3 4 5 |
$year = date("Y", mktime(0, 0, 0, 27, 9, 2022)); $month = date("m", mktime(0, 0, 0, 27, 9, 2022)); $day = date("d", mktime(0, 0, 0, 27, 9, 2022)); |
DATE_FORMAT()も、DATEも年、月、日を示す文字を使用します。
Yは年で、mは月、dは日を示しています。
DATE_FORMATのほうは、
%Yが年、%cが月、%eが日を示しています。
「Y」は互換性があるのに、月、日は互換性がないのかな?
ともっていたら、「%m」「%d」も使えることがわかりました。
具体的には次の通りです。
内容 | 文字 | 取得例 |
年(4桁) | %Y | 2022 |
年(2桁) | %y | 22 |
月(強制2桁) | %m | 01~12 |
月(1桁または2桁) | %c | 1~12 |
日(強制2桁) | %d | 01~31 |
日(1桁または2桁) | %e | 1~31 |
月や日はMAX2桁ですが、2桁で統一するか、一桁で処理にするかで指定文字が変わるということがわかりました。
例えば、1月1日と表現するか、01月01日と表現するかのちがいです。
今回は1桁ありで指定していたため、「%c」「%e」を使用していました。
でも「%m」「%d」もありなので、PHPのdate()関数と類似性はありました。
DATE_FROMATの指定文字について詳しくはこちらです。
これできるの?ということはたいていできます
仕様を考える際に、「ちょっとこれ実現無理ではないか?」と感じることがあります。
ただ、間をおいてゆっくり考えてみると、「あれ、できるんじゃないか?」となることが多いです。
自分の知識内の判断では「無理」でも、いろいろ事例をググって検証してみると、実現できたりします。
プログラム構築とは、得てしてこのようなものだと知りつつ、何年たっても体験から実感することがあります。
本記事がまた役に立てば幸いです。