0

私は現在、多くのおそらく無期限の日付スパンを扱っています。

StartDate     EndDate
---------     ---------
01JAN1921     31DEC2009
10OCT1955     null
...

間隔のもう一方の端が不明であるか、定義されていない可能性があります。私は、間隔が他の間隔のサブ間隔であるかどうか、2つの間隔間のギャップを計算するなど、オーバーラップを検出するための小さな関数に取り組んできました。

たとえば、重複を検出する場合、問題は次のとおりです。

        S       E            S and E are the start and end of the interval
        |       |            we're comparing to. Here both are known, but
s1------+---e1  |            either could be null. The small s:s and e:s 
        |       |  s2....e2  define the intervals we're comparing to and
        |s3--e3 |            again we'd like to allow for open intervals.
        |   s4--+----e4
  s5..e5|       |
    s6--+-------+--s7
        |       |

明確に定義された間隔との重複の検出に関連する質問に基づいて、確認する必要があります

    Coalesce(S,Coalesce(e-1,0))<Coalesce(e,Coalesce(S+1,1))
AND Coalesce(E,Coalesce(s+1,0))>Coalesce(s,Coalesce(E-1,1))

これは(日付や時間の間隔だけでなく)多くの人が扱っているような一般的なことだと思います。私は既存の実装、できれば基本的な比較操作に基づく関数だけを探しています。

4

2 に答える 2

2

区間演算は、幅広く複雑なトピックです。C ++ / Boostには、それを処理するためのライブラリがあります。Pythonも、他の多くの言語だと思います。これはあなたが求めていることですか、それとも一般的すぎますか?

時間間隔に関しては、このSOの質問があり、おそらく「関連」サイドバーで見つけることができる他の質問があります。

于 2010-01-28T07:37:34.497 に答える
1

プログラムで人々が一般的に日付を表​​す3つの一般的な方法があります。

  • グレゴリオ暦では、年、月、日、時間、分、秒。非常に堅牢ですが、数学を行うのは困難です(4年ごとにうるう年ですが、年が400の倍数でない限り、何世紀にもわたってではありません...覚えていますか?)
  • 特定の時刻からの秒数として、うるう秒をカウントするかどうかを選択する必要があるため、問題が発生します(オンラインで「うるう秒」を検索すると、理由がわかります)
  • ユリウス暦では、特定の日付からの日数およびその日の開始からの秒数として

参照として使用する実装については、

  • Javaは、すべきでないことの例です(皆さん、変更可能な日時タイプを作成しないでください)
  • Pythonも混乱しています(日付を解析する簡単な方法はありません)
  • PostgreSQLは日付と時刻を非常にうまく処理します。http://www.postgresql.org/docs/7.4/interactive/datatype-datetime.htmlを参照してください。また、ソースコードを確認することもできます。内部でユリウス暦を使用します。
  • Haskellの標準時間ライブラリも優れており、範囲と精度に制限はありません。そうです、ユリウス日にはbigintを使用し、時間にはbigintの比率を使用します。ライブラリには、イースターが当たる日付を計算するための関数を含む、便利な日付関数が多数含まれています。http://hackage.haskell.org/package/timeを参照してください。
于 2010-01-28T07:48:11.617 に答える