按其他日期拆分日期

vmjh9lq9  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(214)

我有一张table rate 结构如下(近似):

CREATE TABLE `rate` (
    `id`       int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `from`     date NOT NULL,
    `to`       date NOT NULL
)

和一个(大致)相同的表 stop_sale :

CREATE TABLE `stop_sale` (
    `id`       int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `from`     date NOT NULL,
    `to`       date NOT NULL
)

考虑到,对于每一个,它们的时间间隔是它们各自的时间间隔所涵盖的天数范围 from 以及 to 领域:
我希望以这样一种方式一起查询这些表,即时间间隔不重叠,而是进行调整,以便 stop_sale 优先考虑。

示例 rates ```

| id | from | to |
| 1 | "2018-01-05" | "2018-01-31" |
| 2 | "2018-02-01" | "2018-02-15" |
`stop_sale`
| id | from | to |
| 1 | "2018-01-11" | "2018-01-20" |
| 2 | "2018-02-01" | "2018-02-10" |

期望结果

| rate_id | from | to |
| 1 | "2018-01-05" | "2018-01-10" |
| 0 | "2018-01-11" | "2018-01-20" |
| 1 | "2018-01-21" | "2018-01-31" |
| 0 | "2018-02-01" | "2018-02-10" |
| 2 | "2018-02-11" | "2018-02-15" |

注意怎么做 `rate` 与 `id=1` 根据时间间隔分为两个记录 `stop_rate` 与 `id=1` (注: `id` 不重要,只是时间间隔)。
换句话说, `stop_sale` 时间间隔对时间间隔执行减法运算 `rate` ,并且还绘制了最终结果集。
这在sql中是可能的吗?mysql呢?
如果是这样的话,查询的优化程度如何?用php处理这个操作更好吗?
2fjabf4q

2fjabf4q1#

据我所知,仅仅使用sql查询是不可能做到这一点的。这可以在存储函数中迭代解决,但是没有干净的选项返回数据。最好的方法是返回数据的分隔字符串。
另一种方法是构建一个存储过程,定期填充结果数据表,并对其进行php查询。基本逻辑是:
传入起始数据值-起始日期。
使用查询创建临时表:

select * from rates
    where from >= starting_date
    union
    select * from stop_sale
    where from >= starting_date
    order by from asc

遍历临时表。
获取第一个“from”值。
获取下一个更大的“to”值
查找“from”值<current“to”值和>current“from”值,但是!='已在正在填充的结果表中的“from”值
如果找到,则将当前“from”值和“to”值-1天插入正在填充的结果表
否则,将当前“from”值和“to”值插入正在填充的结果表
这个基本的逻辑可以在php中完成,尽管它可能更复杂,因为您需要构建一个从上面的temp表查询返回的行数组,在上面运行逻辑,并构建一个结果数组。这比运行存储过程的效率要低,因为一旦运行存储过程,您只需要在比该运行更新的数据上再次运行它。因此,启动数据参数。
我希望这对你有帮助。

相关问题