MySQLリレーショナルデータベースにSTUDENTデータを保存するphpアプリケーションを作成しています。私は、日なしで月と年を一緒に保存するための最良の方法/データ型を見つけようとしています。私はそれをDATEとして保存し、PHPを使用して1日を1日として保存するだけでよいのか、それとも現在よく知らない別のデータ型を使用するのかわからない。理想的には、1日を保存したくないのは、その日が常に同じであるとは限らず、将来その日が変わった場合にphpソースコードを変更する必要があるためです。
より詳しい背景情報のために、私はSTUDENTのINTENT_TO_GRADを保存しています。クライアントは、この情報をデータ操作に使用するのではなく、レポートの参照または視覚としてのみ使用するように思われます。つまり、このデータの唯一の機能要件はレポートに表示されることです。
MySQLマニュアルには、部分的な日付を保存できると書かれています
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format
MySQLは '2014-00-00'などの不完全な日付の保存を許可しているため、月と日の指定子の範囲はゼロで始まります。
つまり、年と月のみを保存するには、DATE
列を使用して00
の代わりに。例:2013-12-00
。
データの使用方法を検討してください。作成する必要があるレポートがある場合、どの方法でデータをより簡単に取得して操作できますか?
また、日付型フィールドを使用する必要はありません。両方とも整数であるYearフィールドとMonthフィールドを持つことができます。次に、日付を必要とする式を実際に使用する必要がある場合、それらをまとめて日付にキャストするのは簡単です。
そして、日付を1として日付として保存し、それを無視するだけでもまったく問題ありません。結局のところ、これは大した問題ではない(比較的言えば)決定ではないので、私はあなたが一番好きなものを選んでそれを成し遂げます。
2つを整数として2つの別々の列として保存します。検証ケーキを作成し、迅速かつ簡単に並べ替えとグループ化の可能性を可能にします。
SELECT * FROM Users
WHERE
MONTH(DateTime) = '07'
AND
YEAR(DateTime) = '2015'
AND
DAY(DateTime) = '26'
上記のようにフィルタリングできますが、年/月と日を別々に保存したい場合は、インデックス付けとその非常に大きなデータを適用するまで役に立ちません。
別の解決策は、DATETIME
/DATE
ソースから生成された列を構築することです。
_ALTER TABLE stats
ADD COLUMN year SMALLINT GENERATED ALWAYS AS (YEAR(stat_date)) NOT NULL,
ADD COLUMN month smallint GENERATED ALWAYS AS (MONTH(stat_date)) NOT NULL;
_
背景
同様の問題がありました。このスレッドを読んだ後、不完全な日付(ゼロを含む)を保存することにしました。 MySQLの古いバージョンでは機能しましたが、新しいバージョンでは「日付が正しくありません」エラーが発生しました。前述のように、_NO_ZERO_IN_DATE
_設定を使用してエラーを警告に変えることができます。ただし、設定自体は非推奨です。したがって、将来的には、ストリクトモードを無効にして、他のタイプのエラーを抑制することで、日付のゼロのみをサポートすることが可能になります。
NO_ZERO_IN_DATEは非推奨であるため、将来のMySQLリリースでは個別のモード名として削除され、その効果は厳密なSQLモードの効果に含まれます。
私の要件は、テーブルの月間ビューを構築することでした。月にインデックスを追加する必要がありました。そのため、YEAR()
およびMONTH()
を使用してオンザフライでガを計算することはオプションではありませんでした。
生成された列が目的を果たしました。 year
列とmonth
列はプライマリインデックスの一部ではなく、VIRTUAL
(STORED
ではなく)生成列のおかげでスペースを節約することもできました。 。
リンク