【问题标题】:Get the records between two dates获取两个日期之间的记录
【发布时间】:2019-03-14 23:22:38
【问题描述】:

我有一个名为 Billing 的表格,其中包含以下列

id| resource_name | start_date | end_date | total_amount

此表填充了具有不同 start_date 和 end_dates 的不同资源的数据。我需要从表中检索数据。

样本记录

id| resource_name | start_date          | end_date            | total_amount
1 | abc           | 2018-09-15 03:00:00 | 2018-09-15 04:00:00 | 20

如果我编写这样的查询,它将返回上述结果

select * from billing where start_date >= '2018-09-15 03:00:00' and end_date <= '2018-09-15 04:00:00'

但下面没有

select * from billing where start_date >= '2018-09-15 03:00:00' and end_date <= '2018-09-15 03:30:00'

有什么方法可以找回相同的 .我正在使用 Django ORM 来做同样的事情

【问题讨论】:

  • 记录将如何返回时间为 4 并且您给出 3.30 的地方,所以它不会匹配,
  • @Exprator 是的,我知道。我正在检查是否有任何功能可以帮助我做到这一点。而不是使用
  • 不,你不能用任何给出 3.30 的函数来做到这一点,其中 4 更大

标签: django postgresql django-models django-orm


【解决方案1】:

最后我得到了 pgsql 解决方案。但不确定如何将其转换为 Django ORM

SELECT *  FROM billing_lines  WHERE (start_date, end_date) OVERLAPS ('2018-09-15 03:00:00', '2018-09-15 03:30:00');

【讨论】:

    【解决方案2】:

    您的问题有点令人困惑,但是如果您要获取与指定时间段完全重叠的所有订单,则需要稍微修改查询:

    Billing.objects.filter(start_date__lte='2018-09-15 03:30:00', end_date__gt='2018-09-15 03:00:00')
    

    不,这不是写错了。您需要从原始查询中反转日期和 gte/lte。

    IE: Billing.objects.filter(start_date__lte='the end datetime of your time period', end_date__gt='the start datetime of your time period')
    

    这将确保包含与 03:00 到 03:30 块完全重叠的任何订单。所有这些都将包括在内:

    id| resource_name | start_date          | end_date            | total_amount
    1 | abc           | 2018-09-15 03:00:00 | 2018-09-15 04:00:00 | 20
    2 | abd           | 2018-09-15 02:00:00 | 2018-09-15 03:00:01 | 20
    3 | abe           | 2018-09-01 03:00:00 | 2018-09-20 04:00:00 | 20
    4 | abf           | 2018-09-15 03:10:00 | 2018-09-15 03:20:00 | 20
    

    但以下不会:

    id| resource_name | start_date          | end_date            | total_amount
    5 | abg           | 2018-09-15 02:00:00 | 2018-09-15 03:00:00 | 20
    6 | abh           | 2018-09-15 03:30:01 | 2018-09-15 04:00:00 | 20
    

    如果您正在寻找仅在您的时间段内的订单,请使用 Aman Kumar 的答案。

    【讨论】:

    • 感谢重播。您的解决方案适用于某些情况。但在某些情况下会失败
    • 哪些场景?请进一步解释,因为代码完全按照我所说的那样做。如果您选择的日期与 Billing 对象实例的 start_date 和 end_date 完全重叠,它们将被返回。这包括在 start_date 之前开始或在 end_date 之后结束的日期范围,只要日期范围的一部分在您选择的日期内。
    【解决方案3】:

    你可以使用 django 过滤方法。

    Billing.objects.filter(start_date__gte='2018-09-15 03:00:00', end_date__lte='2018-09-15 03:30:00')
    

    【讨论】:

    • 这是我使用的查询。但这不会给出正确的答案。请参考我提供的示例数据和不返回答案的查询
    猜你喜欢
    • 2012-10-17
    • 2013-04-16
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2017-03-27
    相关资源
    最近更新 更多