web-dev-qa-db-ja.com

月と年のみを保存するmysqlデータ型

MySQLリレーショナルデータベースにSTUDENTデータを保存するphpアプリケーションを作成しています。私は、日なしで月と年を一緒に保存するための最良の方法/データ型を見つけようとしています。私はそれをDATEとして保存し、PHPを使用して1日を1日として保存するだけでよいのか、それとも現在よく知らない別のデータ型を使用するのかわからない。理想的には、1日を保存したくないのは、その日が常に同じであるとは限らず、将来その日が変わった場合にphpソースコードを変更する必要があるためです。

より詳しい背景情報のために、私はSTUDENTのINTENT_TO_GRADを保存しています。クライアントは、この情報をデータ操作に使用するのではなく、レポートの参照または視覚としてのみ使用するように思われます。つまり、このデータの唯一の機能要件はレポートに表示されることです。

38
Daniel Wilhoit

なぜわざわざ?それを完全な日付として保存し(おそらく常に最初の日付を使用)、データベース関数 MONTH() および YEAR() を使用します=その一部のみが必要な場合。これにより、範囲クエリなどを実行できるため、そのフィールドの使用がはるかに簡単になります。

50
Brian Roach

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

関連: MySQL日付フィールドに不完全な日付を保存

56
Timo Huovinen

データの使用方法を検討してください。作成する必要があるレポートがある場合、どの方法でデータをより簡単に取得して操作できますか?

また、日付型フィールドを使用する必要はありません。両方とも整数であるYearフィールドとMonthフィールドを持つことができます。次に、日付を必要とする式を実際に使用する必要がある場合、それらをまとめて日付にキャストするのは簡単です。

そして、日付を1として日付として保存し、それを無視するだけでもまったく問題ありません。結局のところ、これは大した問題ではない(比較的言えば)決定ではないので、私はあなたが一番好きなものを選んでそれを成し遂げます。

5
Brandon Moore

2つを整数として2つの別々の列として保存します。検証ケーキを作成し、迅速かつ簡単に並べ替えとグループ化の可能性を可能にします。

3
Kyle Macey
SELECT * FROM Users
WHERE 
    MONTH(DateTime) = '07'
AND 
    YEAR(DateTime) = '2015'
AND 
    DAY(DateTime) = '26'

上記のようにフィルタリングできますが、年/月と日を別々に保存したい場合は、インデックス付けとその非常に大きなデータを適用するまで役に立ちません。

2
Furqan Freed

別の解決策は、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列はプライマリインデックスの一部ではなく、VIRTUALSTOREDではなく)生成列のおかげでスペースを節約することもできました。 。

リンク

0
shapiy