如何在 mysql 中的重叠日期期间找到最合适的日期

How to find the most appropriate date between overlapping date periods in mysql

我有 2 个包含此类数据的表:

Table 1

id s_id s_date
1 33 2021-03-05 10:36:59
2 33 2021-03-06 10:36:59
3 33 2021-03-09 10:36:59
4 33 2021-03-10 13:36:59
5 33 2021-03-11 12:36:59
6 33 2021-03-12 09:00:59
7 33 2021-03-13 13:36:59
8 33 2021-03-14 18:00:00
9 33 2021-03-15 18:00:00
10 33 2021-03-16 13:00:00
11 33 2021-03-17 18:00:00
12 33 2021-03-18 14:00:00
13 33 2021-04-01 18:00:00
14 33 2021-05-02 14:00:00

Table 2

id s_id amount date_from date_to
1 33 100 2012-03-12 00:00:00 2022-01-01 00:00:00
2 33 200 2018-03-12 00:00:09 2021-02-28 00:00:00
3 33 300 2021-03-01 00:00:00 2021-03-31 00:00:00
4 33 400 2021-03-07 00:00:00 2021-03-12 00:00:00

如何在 date_from 和 date_to 最接近 date_from\date_to 范围的 s_date 之间 select 具有适当 ID 的行? 在我的例子中,最合适的行必须是:

id s_id s_date amount
1 33 2021-03-05 10:36:59 300
2 33 2021-03-06 10:36:59 300
3 33 2021-03-09 10:36:59 400
4 33 2021-03-10 13:36:59 400
5 33 2021-03-11 12:36:59 400
6 33 2021-03-12 09:00:59 400
7 33 2021-03-13 13:36:59 300
8 33 2021-03-14 18:00:00 300
9 33 2021-03-15 18:00:00 300
10 33 2021-03-16 13:00:00 300
11 33 2021-03-17 18:00:00 300
12 33 2021-03-18 14:00:00 300
13 33 2021-04-01 18:00:00 100
14 33 2021-05-02 14:00:00 100

谢谢!

是否要使用日期比较筛选行?对于您的示例:

select t.*
from t
where s_date >= date_from and s.date < date_to;

您可以通过以下方式获取每对 date_fromdate_to 的中间日期:

(UNIX_TIMESTAMP(date_from) + UNIX_TIMESTAMP(date_to)) / 2

然后找出与 s_date 的绝对差值并按其排序:

SELECT *
FROM tablename
ORDER BY ABS(UNIX_TIMESTAMP(s_date) - ((UNIX_TIMESTAMP(date_from) + UNIX_TIMESTAMP(date_to)) / 2))

您可以申请 LIMIT 2 以获得最 合适的 ids.
demo.