エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない

      2025/01/31

CakePHP4、CakePHP5の「date型」「datetime型」の最大値は「2999-12-31」

 
CakePHP4系、CakePHP5系の「date型」「datetime型」の最大値は「2999-12-31」までです。
ご注意ください。
 
 

MySQLの「date型」の最大値は「9999-12-31」で CakePHPとは異なる

 
MySQL 公式サイト 11.2.2 DATE、DATETIME、および TIMESTAMP 型
https://dev.mysql.com/doc/refman/8.0/ja/datetime.html
 
上記に、MySQLの「date型」「datetime型」のサポート範囲が書いてあります。
 「date型」は「1000-01-01」から「9999-12-31」
 「datetime型」は「1000-01-01 00:00:00」から「9999-12-31 23:59:59」
 
ちなみに「TIMESTAMP型」はサポート範囲が異なります。
 「TIMESTAMP型」は「1970-01-01 00:00:01(UTC)」から「2038-01-19 03:14:07(UTC)」
 
 
ですので、CakePHP4系、CakePHP5系でも同様に「date型」であれば「9999-12-31」までサポートされているのかと思っていましたが、「2999-12-31」まででした。
 
「3000-01-01」以降の日付を入力しようとするとエラーになりますのでご注意ください。
 
同じように「datetime型」も「2999-12-31 23:59:59」までのサポートになっており、「3000-01-01 00:00:00」以降はエラーとなります。
 
 

CakePHPでは date型は Validationで「2999-12-31」までとなっている

 
CakePHP4系、CakePHP5系で「date型」が「2999-12-31」までなのは、下記の Validationに「2999」まででチェックをする処理があるためです。
 
対象ファイル
vendor/cakephp/src/Validation/Validation.php
 
「function date」(495行目辺り?)に下記の記述があります。
(CakePHP5系の場合は 470行目辺りにあります。)
 

// Don't allow 0000, but 0001-2999 are ok.
$fourDigitYear = '(?:(?!0000)[012]\d{3})';
$twoDigitYear = '(?:\d{2})';
$year = '(?:' . $fourDigitYear . '|' . $twoDigitYear . ')';

 
上記の記述は CakePHP3系、CakePHP4系、CakePHP5系のいずれにもありますので、CakePHP4だけではなく、CakePHP3、CakePHP5でも同様に「2999-12-31」までかと思います。
 
 
また、MySQLの「date型」の最大値は「9999-12-31」ですので、「date型」項目のバリデーションをオリジナルで「9999-12-31」まで対応できるように変更すれば CakePHPでも「9999-12-31」まで扱えるようになるでしょう。
 
 

CakePHP4の関連記事

CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
 
その他の「CakePHP4」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3でファイルのアップロード処理を自作・解説付き・その1
CakePHP3でファイルのアップロード処理を自作・解説付き・その1

CakePHP3でファイルをアップロードする処理を、php.netにある「エラーを起こさない」と説明がある処理を参考に作成。サンプルソースとその解説付きで、コピペでも動くし、カスタマイズも簡単!

CakePHP3のUpload Plugin 3.0をバリデーションなど実運用向けのカスタマイズ方法解説・その2
CakePHP3のUpload Plugin 3.0をバリデーションなど実運用向けのカスタマイズ方法解説・その2

CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその2でバリデーションなどの実用的なカスタマイズ方法を解説。

CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法

CakePHPのデバッグ用のツールであるDebugKitは適切な設定をしないとエラーログにワーニングメッセージが出力される。それを解消する方法を解説。

CakePHP4系、5系でカラムを指定して値があるかないかのチェックする
CakePHP4系、CakePHP5系のexists()でカラムを指定して値の有無をチェックする方法解説

CakePHP4、5で指定したカラムに特定の値に該当のレコードの有無をチェックするにはexists()を使う。単純にカラムを指定する方法から複数条件をand、orで探すこともできる。

CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法

CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。

CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法

CakePHP4でcontrollerで実行したバリデーションの結果をModelのバリデーション結果に追加するメソッド「setError()」「setErrors()」の使い方の解説。

CakePHPのバリデーションを入力値・項目の条件によって変える方法を解説
CakePHPのバリデーションを入力値・項目の条件によって変える方法を解説

入力された値によってバリデーション(入力チェック)の内容を切り替える。その処理をCakePHPで実装する方法を解説。条件ごとに unset関数を使ってバリデーションを削除する、という方法を採る。

CakePHP 2.3 Search Pluginで検索処理 その1設置方法

CakePHPの検索プラグイン Search Pluginの設置方法と基本的な検索処理の解説です。

CakePHP3のアソシエーション機能を使い関連レコードをまとめて削除

CakePHP3でレコードを削除する際に関連するレコードをまとめて削除する機能の解説。フレームワークのメリットを存分に発揮し、コマンドを1行追加するだけで実装可能。

CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法

CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。