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

标签 mysql database database-design datetime date

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

相关文章:

mysql - 层次结构的数据库模型国家 - 组织 - 子组织 - 用户

mysql - SQL错误1022 : Can't write; duplicate key in table

php - 基于足球队积分的特定 ID 上方和下方两行

javascript - 将已经格式化的 HTML 嵌入到 JSON 中

sql - 数据库架构 : Why not create new table for each 'entity' ?

sql - 数千个数据库表 VS 一个巨大的表

android - 消息通知APP数据库结构设计

php - 选择用户详细信息时的 MySQL 更新事件

mysql - 从几天后状态仍然相同的表中获取这些行?

sql - 执行语句还是运行脚本?