1000 ADより前に拡張するレコードのデータベースを作成していますが、MySQLのDateおよびDateTimeフィールドは1000から始まる日付のみをサポートしています。
bigint型を使用してUnixタイムスタンプを使用して1970年1月1日の前/後の秒数をカウントする方法、またはより広い日付範囲をサポートするデータベースソフトウェアに切り替える方法よりも便利な方法はありますか?
1000 ADより前に拡張するレコードのデータベースを作成していますが、MySQLのDateおよびDateTimeフィールドは1000から始まる日付のみをサポートしています。
bigint型を使用してUnixタイムスタンプを使用して1970年1月1日の前/後の秒数をカウントする方法、またはより広い日付範囲をサポートするデータベースソフトウェアに切り替える方法よりも便利な方法はありますか?
回答:
別の方法は、日付の各部分を数値フィールドに格納することです。したがって、3つのフィールドがあります。
year SMALLINT # Store positive values for AD and negative for BC years.
month TINYINT
day TINYINT
この方法でも、人間が読める形式になります。MySQLのさまざまな数値データ型の値の範囲については、数値型の概要を参照してください。ストレージ要件は、データタイプストレージ要件で入手できます。
非常に古い(場合によっては遠い将来の)日付を必要とするアプリケーションでは、ネイティブのRDBMS日付データ型は何もしません。
私があなただったら、ネイティブストレージに文字列型を使用し、次のような場所の意味のある形式に固執します。
役立つ場合は、内部ストレージ形式をUIレイヤーでより見やすい形式に変換するライブラリクラスを構築できます。選択した言語がデータベース内の日付をサポートしている場合は、ネイティブの日付型に変換するライブラリ関数を含めることもできます。
BIT
またはBOOLEAN
列を常に追加して、日付の極性を示すことができます。:)もちろん、それを行う場合、「BC」日付で計算を実行すれば、自分で行うことができます。「偽の」紀元前の日付を操作しているときに、通常、ライブラリ関数によって管理されるカレンダー調整の種類が見落とされることを誰が知っているのか...
たとえば、2015-10-12 10:12:05のように数値形式で日付を格納するテーブルに単一の浮動小数点フィールドがある場合は、20151012が格納されます。101205。3つ以上ではなく、単一フィールドでソートする方が常に良いさまざまなフィールド。
上記のロジックは、いくつかのシナリオでは機能しません。したがって、1日= 86400秒を考慮して、日付を秒に変換しました。紀元前の日付には負の値を使用しました。期待どおりに動作します。