16

これは実際には私が抱えている問題ではありませんが、誰かが中世に関する Web サイトを構築していて、日付を保存したいと考えているとしたら、どうすればよいでしょうか?

MySQL の仕様でDATEは、1000 年を下回らないとされています。形式がYYYY-MM-DD. 995 年のスコットランド王ケネス 2 世の死に関する情報をどのように保存できますか? もちろん、文字列として保存できますが、実際の日付型オプションはありますか?

4

4 に答える 4

4

実際には、ドキュメントの明確化にもかかわらず、MySQL に 1000 年未満の日付を格納できます。

mysql> テストを記述します。
+------+---------+------+-----+---------+-------+
| | フィールド | フィールド タイプ | ヌル | キー | キー | デフォルト | エクストラ |
+------+---------+------+-----+---------+-------+
| | ID | int(11) | はい | | | ヌル | | |
| | 誕生 | 日付 | はい | | | ヌル | | |
+------+---------+------+-----+---------+-------+

-YYYY 形式で年を入力する必要があります。

mysql> テスト値に挿入 (1, '0995-03-05');
クエリ OK、影響を受ける 1 行 (0.02 秒)

mysql> select * from test;
+-----+------------+
| | ID | 誕生 |
+-----+------------+
| | 1 | 0995-03-05 |
+-----+------------+
セットで 1 行 (0.00 秒)

-そして、これを日付として操作できるようになります:

mysql> テストから出生 + 間隔 5 日を選択します。                                                                              
+------------------------+                                                                                                   
| | 出産+間隔5日|                                                                                                   
+------------------------+                                                                                                   
| | 0995-03-10 |
+------------------------+
セットで 1 行 (0.03 秒)

安全性について。これが MySQL 5.x で機能しないケースに直面したことはありません (もちろん、100% 機能するという意味ではありませんが、少なくとも一定の確率で信頼できます)。

紀元前の日付について(キリスト以下)。それは簡単だと思います.MySQLには負の日付も保存する方法がありません. つまり、年を符号付き整数フィールドとして個別に保存する必要があります。

mysql> select '0001-05-04' - 間隔 1 年を above_bc として、'0001-05-04' - 間隔 2 年を below_bc として;
+------------+----------+
| | 上記_bc | 以下_bc |
+------------+----------+
| | 0000-05-04 | ヌル |
+------------+----------+
セット内の 1 行、1 警告 (0.00 秒)

mysql> 警告を表示します。
+---------+------+-------------------------------- ------------+
| | レベル | コード | メッセージ |
+---------+------+-------------------------------- ------------+
| | 警告 | 1441年 | 日時関数: 日時フィールドのオーバーフロー |
+---------+------+-------------------------------- ------------+
セットで 1 行 (0.00 秒)

しかし、いずれにせよ(0年未満/0年以上)、その場合は日付部分を整数として保存する方がよいと思います-これは文書化されていない機能に依存しません。ただし、日付としてではなく、これらの 3 つのフィールドを操作する必要があります (したがって、ある意味では問題の解決策ではありません)。

于 2013-09-06T09:55:30.567 に答える
0

悲しいことに、現在最も簡単なオプションは、年、月、日を年として別々のフィールドに格納することだと思いますsmallint

于 2013-09-06T09:52:57.610 に答える
0

http://dev.mysql.com/doc/refman/5.6/en/datetime.htmlから引用するには

For the DATE and DATETIME range descriptions, “supported” means that although earlier values might work, there is no guarantee.

そのため、十分に構成された MySQL インストールがあれば、より広い範囲が機能するという良い変更があります。

負ではない範囲を持つように見える TIMESTAMP を使用しないようにしてください。

The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.

これは、2^36 秒 * -1000 (Javascript のミリ秒を取得するため) で得られる UNIX エポック(1) のどれだけ前に取得できる JavaScript の例です。

d = new Date((Math.pow(2, 36) - 1) * -1000)
Sun May 13 -208 18:27:45 GMT+0200 (Westeuropäische Sommerzeit)

したがって、エポックに関連する BIGINT として履歴日付を保存することをお勧めします。

MxSQL 5.6については、 http: //dev.mysql.com/doc/refman/5.6/en/integer-types.htmlを参照してください。


(1)

epoch = new Date(0)
Thu Jan 01 1970 01:00:00 GMT+0100 (Westeuropäische Normalzeit)
epoch.toUTCString()
"Thu, 01 Jan 1970 00:00:00 GMT"
于 2013-09-06T10:33:29.160 に答える