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


9

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

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


1
これは、SOでかなりよく答えられています:stackoverflow.com/q/2487543/514119
stanleykylee

@stanleykylee指摘してくれてありがとう。質問は異なりましたが、問題はコメントで浮上し、その後、「参照日を選択して数値フィールドを使用する」という行に沿って回答されました。そして、私の質問は、とりわけ、これが最良の選択肢であるかどうかを尋ねます。
David LeBauer、2011年

ああ、私はどういうわけか質問でそれを逃しました。facepalmを実行してこれらのコメントを削除できるようにする...
jcolebrand

回答:


7

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

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

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


1
これに+1を付けたいのですが、日付のロジックが恐ろしいものになると確信しています。
Camilo Martin、

たとえば、2015-10-12 10:12:05
atpatil11、

8

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

私があなただったら、ネイティブストレージに文字列型を使用し、次のような場所の意味のある形式に固執します。

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


1
SQL Server 2008+を使用している場合は、DATETIME2が答えです。期間:西暦1月1日から西暦9999年12月31日。
Nick Chammas、2011年

1
良い提案。他のシステムではCHECK、日付文字列形式を適用するための制約を追加でお勧めします。残念ながら、MySQL CHECK制約を強制しません
Nick Chammas、2011年

2
@NickはSQL Server 2008+のDATETIME2について同意しました(1753年は見逃します)が、OPは彼の地位にあるMySQLから始まります。また、紀元前1年12月31日をカレンダーに追加する必要があるとすぐに、DATETIME2も低下します。:)
Joel Brown

1
BITまたはBOOLEAN列を常に追加して、日付の極性を示すことができます。:)もちろん、それを行う場合、「BC」日付で計算を実行すれば、自分で行うことができます。「偽の」紀元前の日付を操作しているときに、通常、ライブラリ関数によって管理されるカレンダー調整の種類が見落とされることを誰が知っているのか...
Nick Chammas

1
マーク、私が文字列をお勧めする理由は、文字列を適切に定式化する限り、何も処理せずに人間が読める(そしてある程度編集可能であっても)ので、特別な日付操作関数を比較的簡単に構築できるためです。日付を数値として格納するのは、人間のようなエンコーディングを解釈できる関数のライブラリがない限り、ひどく、ひどく不便です。もちろん、そのようなライブラリが用意されている場合、日付を数値としてエンコードする方がはるかに賢明です。
Joel Brown、

1

たとえば、2015-10-12 10:12:05のように数値形式で日付を格納するテーブルに単一の浮動小数点フィールドがある場合は、20151012が格納されます。101205。3つ以上ではなく、単一フィールドでソートする方が常に良いさまざまなフィールド。

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


1
BCの負の数?
ロブセジウィック2017

1
151012と150819はどちらも15ADにあり、-151109は15BCにあります
Rob Sedgwick
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.