どもです。
PHPで日付データがあるとき、の条件分岐をしたい。
このとき、厳密な日付フォーマットチェックを行いたいのであれば、DateTimeクラスを用いるのが妥当です。
参考サイト:
[Qitta]【PHP】DateTimeクラスでcheckdate()より汎用性のある日付チェックを行う
[SOFTELメモ]【php】DateTimeクラスで日付の表示の補正をおこなう
しかし、今回はMySQLからデータを取り出して使いたい場合です。
厳密なフォーマットチェックは入力時に行うべきことであって、この場合はもっとシンプルにできるはず。
そして問題となるのはMySQLにて、DATETIMEカラムをNOT NULLにすると、
デフォルト値が「0000-00-00 00:00:00」になるということです。
さて、どうすれば最短かつ明瞭な条件分岐になるか。
strtotime()を利用
ああ、これでいいのか。
「0000-00-00 00:00:00」のとき、環境次第でstrtotime()の返す値が「-62170016400」だったり「false」だったりするという素敵な話がありますが、falseは0なので、「0より大きい」という条件ならどちらもクリアできるわけです。
ついでにいうなら、空白や他の文字など、日付に変換できないものも弾いてくれるので尚良し。
しかし、1970年1月1日以降の日付でないとfalseになってしまうので、汎用性が高いかと言われると、微妙。
文字列として比較
別解。文字列型として比較するパターン。
記述的にはちょっと面倒。しかし処理的にはほぼ最短かつ意外とカバー範囲が広い。
"0000-00-00 00:00:00" は、当然false。
"0000-00-00" もfalseなので、カラムがDATE型かDATETIME型か区別する必要なし。
空白もfalse。
うん、要点を満たしています。
上の解の問題点、1970年より前がfalseとなることもない。西暦1年から許容。
難点は空白or想定のフォーマット以外が入ったときにtrueとなることだが、DBから抜いたそのままのデータを対象とするならその配慮も不要。
泥臭いが、案外これが最適解かもしれない。