在过去的几天里,我一直在为这个问题苦苦思索,所以我求助于你,Stack Overflow。
我正在使用的软件包含时间敏感数据。通常的解决方案是生效日期和到期日期。
EFF_DT XPIR_DT VALUE
2000-05-01 2000-10-31 100
2000-11-01 (null) 90
这很容易。不幸的是,我们需要在任意遥远的 future 每年重复一次的数据。也就是说,每年5月1日(从2000年开始)我们可能希望有效值为100,而每年11月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 年之前的值可能是恒定的(没有翻转), future 十年的值可能与上一个十年的值不同:
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 年 3 月 9 日?
执行此操作的最佳方法似乎是找到每个有效日期(所有事件行中)的最新实例,然后查看哪个是最大的。
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 年 6 月 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。
使用 MySQL 日期函数,计算 MOST_RECENT
字段的最有效方法是什么?
或者,谁能想到更好的方法来做到这一点?
如果重要的话,语言是 Java。谢谢大家!
最佳答案
假设您想要的“日期”是“2007-06-20”。
您需要将非重复元素与重复元素结合起来,这样您就可以做这样的事情(未经测试,可能需要一些思考,但应该给您一般的想法):
select * from (
select * from mytable
where
repeatable = false
and
EFF_DT <= '2007-06-20' < XPIR_DT
union all
select * from mytable
where
repeatable = true
and EFF_DT <= str_to_date(concat("2007", "-", month(EFF_DT), "-", day(EFF_DT)), "%Y-%m-%d") < XPIR_DT
)
order by EFF_DT desc limit 1
关于mysql - 在 MySQL 数据库中存储每年可重复的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2411794/