在已往的几天里,我一向将头撞在桌子上,因此,我转向Stack Overflow.
我正在行使的软件具偶然刻敏感数据.凡是的办理方案是见效和到期日期.
EFF_DT XPIR_DT VALUE
2000-05-01 2000-10-31 100
2000-11-01 (null) 90
这很轻易.不幸的是,我们要求数据在将来很长时刻内恣意一再.换句话说,每个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年之前的值也许是恒定的(没有触发器),而且将来十年的值也许与上一个十年的值差异:
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
因为2009-11-01晚于2009-05-01,因此本日的值是90.
譬喻,在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.
行使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
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|