如何在 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_from
和 date_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
以获得最 合适的 id
s.
见 demo.
我有 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_from
和 date_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
以获得最 合适的 id
s.
见 demo.