Функции для интервалов значений - PullRequest
0 голосов
/ 28 января 2010

В настоящее время я имею дело с большим количеством возможных неопределенных интервалов дат, т. Е.

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

где другой конец интервала может быть неизвестен или не определен. Я работал над небольшими функциями для определения перекрытия, является ли интервал подынтервалом другого, вычисляя разрыв между двумя интервалами и т. Д.

Например, для обнаружения перекрытий, проблема

        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))

Полагаю, это настолько распространенная вещь (касающаяся не только дат или временных интервалов), что многие люди имели с этим дело. Я ищу существующие реализации, предпочтительно просто функции, основанные на базовых операциях сравнения.

Ответы [ 2 ]

2 голосов
/ 28 января 2010

Интервальная арифметика - это широкая и сложная тема. C ++ / Boost имеет библиотеку для работы с ней. Python тоже, и я думаю, многие другие языки. Это то, о чем вы спрашиваете, или это слишком общее?

Что касается временных интервалов, есть этот ТАК вопрос и, вероятно, другие, которые вы можете найти на боковой панели «Связанные».

1 голос
/ 28 января 2010

Существует три распространенных способа представления дат в программах.

  • В григорианском календаре: годы, месяцы, дни, часы, минуты, секунды. Это очень надежно, но с математикой трудно справиться (високосный год каждый четвертый год, но не столетия, если год не кратен 400 ... вы помните это?)
  • Как количество секунд с определенного времени, хотя это создает проблемы, так как вам нужно выбрать, считать ли високосные секунды (найдите «високосные секунды» онлайн, и вы поймете, почему)
  • В юлианском календаре - количество дней с определенной даты и количество секунд с начала этого дня

Что касается реализаций для использования в качестве ссылки,

  • Java является примером того, чего не следует делать (ребята, не создавайте изменяемые типы даты и времени)
  • Python также беспорядок (не простой способ разобрать даты)
  • PostgreSQL очень хорошо работает с датами и временем. Смотрите http://www.postgresql.org/docs/7.4/interactive/datatype-datetime.html,, и вы также можете посмотреть на исходный код. Он использует юлианский календарь внутри.
  • Стандартная библиотека времени Haskell также хороша и имеет неограниченный диапазон и точность - это верно, они используют bigints для юлианской даты и соотношение bigints для времени. Библиотека включает в себя множество полезных функций даты, в том числе для расчета даты, на которую выпадает Пасха. Смотри http://hackage.haskell.org/package/time.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...