Mysql 将为日期范围(从、到)指定的值应用到每个日期包含一行的表中的值

Mysql 将为日期范围(从、到)指定的值应用到每个日期包含一行的表中的值,mysql,sql,Mysql,Sql,首先,很抱歉我的题目,但我的英语太差了,无法解释我问题的意思 假设我们有两张桌子。第一个表tbl_percents包含日期范围内的百分比值历史记录。如果日期字段to等于0000-00-00,则表示它是未完成的范围 table: tbl_percents from date to date percent int example content: 2001-01-01 | 2015-01-21 | 10% 2015-01-21 | 0000-00-00 | 20% 第二个表是tbl_reven

首先,很抱歉我的题目,但我的英语太差了,无法解释我问题的意思

假设我们有两张桌子。第一个表
tbl_percents
包含日期范围内的百分比值历史记录。如果日期字段
to
等于
0000-00-00
,则表示它是未完成的范围

table: tbl_percents
from date
to date
percent int

example content:
2001-01-01 | 2015-01-21 | 10%
2015-01-21 | 0000-00-00 | 20%
第二个表是
tbl_revenue
,其中包含特定日期的收入值

table: tbl_revenue
date date
revenue bigint

example content:
2014-01-10 | 10
2015-01-22 | 10
现在我们要将表
tbl_percents
中指定的百分比应用于收入。因此,我们希望得到如下结果:

2014-01-10 | 1 #because from 2001-01-01 to 2015-01-21 percent = 10%
2015-01-22 | 2 #because from 2015-01-22 till now percent = 20%
是否可以在单个SQL查询中获得此结果

类似于:

SELECT (CAST(COALESCE(SELECT [percent] FROM tbl_percents 
  WHERE tbl_revenue.[date] BETWEEN TO AND FROM OR [date] > TO 
  AND FROM = '0000-00-00' LIMIT 1),0) AS DECIMAL(12,2)) / 100) * revenue
  AS MyNewVal FROM tbl_revenue

我不能在我现在的位置测试这个,但它可能会给你指明一个好的方向。我认为您需要将int存储的[percent]字段转换为十进制,以避免10/100==0,但在其他情况下,它似乎是向前的。

是的。您希望使用中间条件进行联接。我必须提醒您,这些类型的查询非常昂贵,速度非常快,因此您不希望在庞大的数据集上执行此操作。也就是说,您可以通过以下方式连接表:

SELECT b.revenue, a.percent
FROM tbl_percents AS a
INNER JOIN tbl_revenue AS b
ON b.date BETWEEN a.from_date AND 
     CASE WHEN a.to_date = DATE("0000-00-00") THEN DATE("2100-01-01")
          ELSE a.to_date END
基本上,我正在做的是将截止日期设置为非常大的日期,并且是在将来(即2100年1月1日)。如果截止日期为0000-00-00,则我将在未来日期应用非常大的值。否则我就用to_约会。使用它,我将按收入日期加入我的百分比表,其中收入日期介于百分比开始日期和修改后的百分比结束日期之间

再说一次,对于一个庞大的数据集来说,这在计算上不是一个好主意。。。但就一般而言,它应该工作得很好。如果您开始在速度/性能方面遇到问题,我建议尝试使用脚本语言(如R或Python)应用类似的逻辑

祝你好运