gpt4 book ai didi

mysql - 在 MySQL 数据库中存储每年可重复的值

转载 作者:可可西里 更新时间:2023-11-01 08:22:52 24 4
gpt4 key购买 nike

在过去的几天里,我一直在为这个问题苦苦思索,所以我求助于你,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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com