【问题标题】:How to find the most appropriate date between overlapping date periods in mysql如何在mysql中的重叠日期期间找到最合适的日期
【发布时间】:2021-06-27 15:20:28
【问题描述】:

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

表 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

表 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

如何选择具有适当 id 的行,其中 date_from 和 date_to 之间的 s_date 最接近 date_from\date_to 范围? 在我的情况下,最合适的行必须是:

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

谢谢!

【问题讨论】:

    标签: mysql sql date datetime date-range


    【解决方案1】:

    您可以通过以下方式获取每对 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 以获得 2 个最合适 ids。
    请参阅demo

    【讨论】:

    • 事实上,如果 s_date 将在过滤器范围之间调用,则行数可以是一个月中的天数,甚至是无限的。
    • @Doom 我不明白你的评论。我所看到的只是您发布的示例数据。所以我的查询适用于此示例数据。它返回以这样的方式排序的行,即靠近每个范围中间的 s_dates 位于顶部。您可以随意过滤查询。
    • 看来我问的问题不是很正确。你的代码工作得很好。谢谢。我问另一种方式。再次感谢。
    【解决方案2】:

    您要使用日期比较过滤行吗?对于您的示例:

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

    【讨论】:

    • 在这种情况下,将为 s_id 选择多行,对于 s_id 33,它将是 id 3 和 4,它们都在范围内。
    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 2014-09-04
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2013-04-27
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多