sql >> データベース >  >> RDS >> Mysql

MySQLは過去の日付(1200など)をサポートしていますか?

    質問(1200年)で使用した特定の例では、技術的にはうまくいきます。

    ただし、一般的に、この用途にはタイムスタンプはお勧めできません。まず、範囲の制限は任意です。MySQLでは1000年1月1日です。12〜13世紀のものを使用している場合は、問題はありません。古いもの(10世紀以前)を追加する必要があります。日付は悲惨に壊れます。問題を修正するには、すべての履歴日付をより適切なものに再フォーマットする必要があります。

    タイムスタンプは通常、指定された「ティック間隔」と「エポックポイント」を持つ生の整数として表されるため、数値は実際には、エポックから表された日付(または負の日付の場合はその逆)までに経過したティック数です。これは、他の固定整数データ型と同様に、表現可能な値のセットが有限であることを意味します。私が知っているほとんどのタイムスタンプ形式は、精度を優先して範囲を犠牲にします。これは主に、時間演算を実行する必要があるアプリケーションが、まともな精度で実行する必要があるためです。一方、過去の日付を処理する必要があるアプリケーションが、深刻な計算を実行する必要があることはめったにありません。

    つまり、タイムスタンプは正確を意味します 日付の表現。 2番目(または1秒の端数)の精度は、歴史的な日付には意味がありません。ミリ秒単位で、8番目のヘンリーがイングランドの王として戴冠したのはいつですか。

    MySQLの場合、形式は本質的に「4桁の年」として定義されるため、関連する最適化は、年が4桁になる、または文字列全体が正確に10文字になるという仮定に依存できます(「yyyy- mm-dd ")など。タイトルに記載した日付がまだ当てはまるのは運の問題ですが、それを信頼することも危険です。DB自体が保存できるものに加えて、サーバースタックの残りの部分は操作できます。たとえば、PHPを使用してデータベースを操作している場合、過去の日付を処理しようとすると、ある時点でクラッシュする可能性が非常に高くなります(32ビット環境では、UNIXスタイルのタイムスタンプの範囲は1901年12月13日から2038年1月19日)。

    要約すると、MySQLは4桁の年の日付を適切に保存します。ただし、一般に、履歴日付にタイムスタンプを使用すると、問題や頭痛の種が頻繁に発生することがほぼ保証されます。そのような使用は強くお勧めします。

    これがお役に立てば幸いです。

    編集/追加:

    どのDBもこの種の日付をあまりサポートしていないと思います。それを使用するアプリケーションは、ほとんどの場合、文字列/テキスト表現で十分です。実際、1年目以降の日付の場合、テキスト表現でも正しい並べ替え/比較が行われます(日付が桁違いに表されている場合:y、m、dの順序)。ただし、「負の」日付も含まれている場合、比較は失敗します(正の日付よりも早く比較されますが、2つの負の日付を比較すると逆の結果になります)。

    1年目以降の日付のみが必要な場合、または並べ替えが不要な場合は、文字列を使用することで生活を大幅に楽にすることができます。

    それ以外の場合、最善のアプローチは、ある種の数値を使用し、独自の「ティック間隔」と「エポックポイント」を定義することです。適切な間隔は数日である可能性があります(実際にさらに精度が必要な場合を除きますが、それでも整数ではなく「実際の」(浮動小数点)数値に依存できます)。そして、合理的なエポックは1月1日1日である可能性があります。主な問題は、これらの値をテキスト表現に変換することです。次の詳細に留意する必要があります。

    • うるう年には1日余分にあります。
    • うるう年の規則は、1582年にジュリアン暦からグレゴリオ暦に変更されて「400の倍数でない限り100の倍数を除いて4の倍数」になるまで「4の倍数」でした。
    • ユリウス暦の最終日は1582年10月4日でした。グレゴリオ暦の最初の翌日は1582年10月15日でした。新しい暦を季節と再び一致させるために、10日がスキップされました。
    • >
    • コメントに記載されているように、上記の2つのルールは国によって異なります。教皇領と一部のカトリック諸国は、指定された日付に新しいカレンダーを採用しましたが、他の多くの国では採用に時間がかかりました(最後は1926年のトルコ)。 。これは、1582年の教皇勅書から1926年の最後の養子縁組までの日付が地理的な文脈なしでは曖昧になり、処理がさらに複雑になることを意味します。
    • 「0年目」はありません。1年目の前の年は-1年目、つまり紀元前1年目でした。

    これらはすべて、非常に精巧なパーサーおよびフォーマッター関数を必要としますが、多くのケースバイケースの分割を超えて、それほど複雑ではありません(コーディングは面倒ですが、非常に簡単です)。基礎となる表現として数値を使用することで、値の任意のペアを正しく並べ替え/比較できます。

    これを知っているので、今ではあなたのニーズにより適したアプローチを取ることがあなたの選択です。



    1. MySQLデータベースの名前を変更します

    2. postgresql --sql--`true`値のカウント

    3. Laravel5のorderByDescで平均を取得する方法

    4. 主キーにnull以外を指定する必要がありますか? Oracle / SQL