按其他日期分割日期

时间:2018-01-05 16:12:47

标签: mysql sql date

我有一张表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
)

考虑到,对于每一个,时间间隔是他们在各自的fromto字段之间所涵盖的天数范围:

我想以这样的方式查询这些表,即时间间隔不重叠,而是调整以使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_rateid=1的时间间隔拆分为两个记录(注意:id s并不重要,只是时间间隔)。

换句话说,stop_sale时间间隔在rate的时间间隔执行减法运算,并且也用最终结果集绘制。

  • 这可能与SQL有关吗?和MySQL?
  • 如果是这样,查询的最佳性如何?在PHP中处理这个操作会更好吗?

1 个答案:

答案 0 :(得分:0)

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

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

传递起始数据值 - 开始日期。

使用查询创建临时表:

    select * from rates
    where from >= starting_date
    union
    select * from stop_sale
    where from >= starting_date
    order by from asc
  • 通过临时表迭代。
    • 从'值'获得第一个。
    • 下一个更大'到'值
    • 寻找'from'的价值<当前'到'值和>当前'from'值但是!='from'已填充结果表中的值
      • 如果发现将'当前'从'值和'到'值-1天插入到正在填充的结果表中
      • else将当前'从'值和'到'值插入到正在填充的结果表中

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

我希望这对你有所帮助。