I`w got an 2 tables with such data:
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 |
How to select row with appropriate id where s_date between date_from and date_to most close to date_fromdate_to range? In my case most appropriate rows must be:
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 |
Thank you!
Advertisement
Answer
You can get the mid date for each pair of date_from
and date_to
with:
(UNIX_TIMESTAMP(date_from) + UNIX_TIMESTAMP(date_to)) / 2
Then find the absolute difference from s_date
and sort by that:
SELECT * FROM tablename ORDER BY ABS(UNIX_TIMESTAMP(s_date) - ((UNIX_TIMESTAMP(date_from) + UNIX_TIMESTAMP(date_to)) / 2))
You can apply LIMIT 2
to get the 2 most appropriate id
s.
See the demo.