首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按其他日期分隔日期

按其他日期分隔日期
EN

Stack Overflow用户
提问于 2018-01-05 16:12:46
回答 1查看 58关注 0票数 0

我有一个表rate,其结构如下(近似):

代码语言:javascript
运行
复制
CREATE TABLE `rate` (
    `id`       int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `from`     date NOT NULL,
    `to`       date NOT NULL
)

和一个(近似)相同的表stop_sale

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
| id | from         | to           |
| 1  | "2018-01-05" | "2018-01-31" |
| 2  | "2018-02-01" | "2018-02-15" |

stop_sale

代码语言:javascript
运行
复制
| id | from         | to           |
| 1  | "2018-01-11" | "2018-01-20" |
| 2  | "2018-02-01" | "2018-02-10" |

期望结果

代码语言:javascript
运行
复制
| 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 with id=1是如何根据stop_rateid=1的时间间隔分成两个记录的(注意:id不重要,只是时间间隔)。

换句话说,stop_sale时间间隔对rate的时间间隔执行减法操作,并使用最终的结果集绘制。

  • 这在SQL中是可能的吗?MySQL呢?
  • 如果是这样,那么查询的最优程度是多少?在PHP中处理这个操作更好吗?
EN

回答 1

Stack Overflow用户

发布于 2018-01-05 18:55:48

据我所知,仅用SQL查询就无法做到这一点。这可以在存储的函数中迭代地解决,但是没有返回数据的干净选项。最好是返回数据的分隔字符串。

另一种方法是构建一个存储过程,定期填充结果数据的表,并对其进行php查询。基本逻辑是:

传入开始数据值-开始日期。

创建一个具有查询的临时表:

代码语言:javascript
运行
复制
    select * from rates
    where from >= starting_date
    union
    select * from stop_sale
    where from >= starting_date
    order by from asc
  • 遍历temp表。
    • 先得到“从”的价值。
    • 获得下一个更大的“to”值
    • 在正在填充的结果表中查找“从”值“< current”到“值”和“当前值”,但是!=“从”已填充的结果表中的值
      • 如果找到,将当前‘从’值和‘到’值-1天插入正在填充的结果表中。
      • 否则,将当前“从”值和“到”值插入正在填充的结果表中。

这个基本逻辑可以在php中完成,尽管它可能更复杂,因为您需要构建从上面的temp表查询返回的行数组,在上面运行逻辑,并构建一个结果数组。这将比运行存储过程效率低,因为一旦运行存储过程,您只需要在比该运行更新的数据上再次运行它。因此,starting_data参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48117311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档