Последние несколько дней я бился головой об стол, и поэтому я обращаюсь к вам, Переполнение стека.
Программное обеспечение, над которым я работаю, содержит данные, чувствительные ко времени. Обычное решение для этого - даты вступления в силу.
EFF_DT XPIR_DT VALUE
2000-05-01 2000-10-31 100
2000-11-01 (null) 90
Это было бы легко. К сожалению, нам нужны данные, которые повторяются на ежегодной основе произвольно в будущем. Другими словами, каждый 1 мая (начиная с 2000 года) мы можем захотеть, чтобы эффективное значение равнялось 100, а каждый 1 ноября мы можем захотеть изменить его на 90.
Это может быть правдой долгое время (> 50 лет), и поэтому я не хочу просто создавать сотню записей. То есть я не хочу этого делать:
EFF_DT XPIR_DT VALUE
2000-05-01 2000-10-31 100
2000-11-01 2001-04-30 90
2001-05-01 2001-10-31 100
2001-11-01 2002-04-30 90
2002-05-01 2002-10-31 100
2002-11-01 2003-04-30 90
...
2049-05-01 2049-10-31 100
2049-11-01 2050-04-30 90
2050-05-01 2050-10-31 100
2050-11-01 2051-04-30 90
Эти значения также могут изменяться со временем. Значения до 2000 года могли быть постоянными (без триггеров), и значения на ближайшее десятилетие могут отличаться от значений за последнее:
EFF_DT XPIR_DT REPEATABLE VALUE
1995-01-01 2000-04-30 false 85
2000-05-01 2010-04-30 true 100
2000-11-01 2010-10-31 true 90
2010-05-01 (null) true 120
2010-11-01 (null) true 115
У нас уже есть текстовый файл (из унаследованного приложения), в котором данные хранятся в форме, очень близкой к этой, так что есть преимущества в том, чтобы придерживаться этого типа структуры как можно ближе.
Затем возникает вопрос о поиске: какое значение будет применяться к сегодняшнему дню, 2010-03-09?
Кажется, что лучший способ сделать это - найти самый последний экземпляр каждой даты вступления в силу (из всех активных строк), а затем посмотреть, какая из них самая большая.
EFF_DT MOST_RECENT XPIR_DT VALUE
2000-05-01 2009-05-01 2010-04-30 100
2000-11-01 2009-11-01 2010-10-31 90
Значение на сегодня будет 90, поскольку 2009-11-01 позже, чем 2009-05-01.
На, скажем, 2007-06-20:
EFF_DT MOST_RECENT XPIR_DT VALUE
2000-05-01 2007-05-01 2010-04-30 100
2000-11-01 2006-11-01 2010-10-31 90
Значение будет равно 100, поскольку 2007-05-01 позже, чем 2006-11-01.
Как использовать наиболее эффективный способ вычисления поля MOST_RECENT
с использованием функций даты MySQL?
Или кто-нибудь может придумать лучший способ сделать это?
Язык - Java, если это имеет значение. Спасибо всем!