多くの場合、年しか分からない日付値を格納する最良の方法は何ですか?
MySQL では、NO_ZEROES_IN_DATE SQL モードが有効になっていない限り、日付部分にゼロを使用できますが、これはデフォルトでは無効になっています。月と日がゼロの可能性がある場合に日付フィールドを使用しない理由、または年、月、日 (year(4)、tinyint、tinyint) の 3 つの異なるフィールドに分割する理由はありますか?
DBMS 間の移植性が重要でない限り、単一の日付フィールドを使用する傾向があることは間違いありません。適度に複雑な日付関連のクエリが必要な場合でも、日、月、年の値を別々のフィールドに入れるのは面倒です。
MySQL には豊富な日付関連関数があります - http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html。年の値だけを返したい場合は YEAR(yourdatefield) を使用し、クエリの WHERE 句に含めたい場合は同じことを使用します。
より良い方法は、日付を 3 つのフィールドに分割することです。年月日。これにより、格納、並べ替え、および検索の完全な柔軟性が得られます。
また、必要に応じてフィールドを実際の日付フィールドに戻すのは非常に簡単です。
最後に、DBMS 間で移植可能です。日付値の有効な部分として 0 をサポートしている人は他にいないと思います。
LIKE 操作を試すことができます。例: SELECT * FROM table WHERE date_feield LIKE 2009;
結果のデータをどのように使用するかによって異なります。簡単な答えは、年だけが 1 月 1 日として知られている日付を単純に格納することです。このアプローチは非常に単純で、すべての標準の組み込み日付関数を使用して年ごとに集計できます。
月または日付が重要な場合に問題が発生します。たとえば、レコードの経過日数を日、週、月で判断しようとしている場合や、この小さなレベルの粒度で分布を表示したい場合などです。ただし、この問題は何らかの形で存在します。完全な日付と年だけの日付がある場合、そのような場合にそれらをどのように表現しますか?
これを行うには、Mysql で単一の日付フィールドを使用できます。以下の例では、フィールドのデータ型は日付です。
mysql> select * from test;
+------------+------+
| field | id |
+------------+------+
| 2007-00-00 | 1 |
+------------+------+
1 row in set (0.00 sec)
mysql> select * from test where YEAR(field) = 2007;
+------------+------+
| field | id |
+------------+------+
| 2007-00-00 | 1 |
+------------+------+
1 つのフィールドを使用すると、クエリが簡単になります。