web-dev-qa-db-ja.com

MySQLで西暦1000年より前の日付を処理する最良の方法は?

1000 ADより前に拡張するレコードのデータベースを作成していますが、MySQLのDateおよびDateTimeフィールドは1000から始まる日付のみをサポートしています。

Bigint型を使用してUnixタイムスタンプを使用して1970年1月1日の前/後の秒数をカウントする方法、またはより広い日付範囲をサポートするデータベースソフトウェアに切り替える方法よりも便利な方法はありますか?

9
David LeBauer

別の方法は、日付の各部分を数値フィールドに格納することです。したがって、3つのフィールドがあります。

year  SMALLINT     # Store positive values for AD and negative for BC years.
month TINYINT
day   TINYINT

この方法でも、人間が読める形式になります。 MySQLのさまざまな数値データ型の値の範囲は 数値型の概要 で入手できます。ストレージ要件は データタイプストレージ要件 で入手できます。

7
dabest1

非常に古い(場合によっては遠い将来の)日付を必要とするアプリケーションでは、ネイティブのRDBMS日付データ型は機能しません。

私なら、ネイティブストレージに文字列型を使用し、+ YYYY-MM-DDのような場所の意味のある形式を使用して、BC/ADと予測可能な過去または合理的な将来の日付に対応します。

役立つ場合は、内部ストレージ形式をUIレイヤーでより見やすい形式に変換するライブラリクラスを作成できます。選択した言語がデータベース内の日付をサポートしている場合は、ネイティブの日付型に変換するライブラリ関数を含めることもできます。

8
Joel Brown

たとえば、日付を数値形式で格納するテーブルに単一のfloatフィールドがある場合はどうでしょうか。 2015-10-12 10:12:05は保存されます20151012.101205。3つ以上の異なるフィールドを持つよりも、単一のフィールドでソートする方が常に良いです。

上記のロジックは、いくつかのシナリオでは機能しません。したがって、1日= 86400秒を考慮して、日付を秒に変換しました。紀元前の日付には負の値を使用しました。期待どおりに動作します。

1
atpatil11