【问题标题】:Comparing day ranges with Django用 Django 比较日期范围
【发布时间】:2015-06-19 04:16:33
【问题描述】:

我的表有两列存储特定交易开始和结束的日期。这些列的值是整数,并遵循 Python 使用的日期时间库相同的模式。

我的逻辑目前适用于不环绕一周的日期范围,即。周一至周五、周四至周六、周二至周四等。我不知道如何捕捉下周的交易,例如周五至周一、周六至周二等。这是我使用 Django 的声明:

Deal.objects.filter(Q(deal_day_start__lte=current_day) & Q(deal_day_end__gte=current_day))

显然,这给我带来了周五 - 周一范围的问题,因为例如,当天可以是周日,日期时间为 0,而交易开始日为周五的 5。

有没有使用 Django 解决这个问题的简单方法?如果我使用 Python if else 语句,我显然可以创建多个分支并捕获这种情况,但我不确定如何使用 Django 来解决这个问题。

【问题讨论】:

  • 只代表工作日的 int 是一个可怕的想法...重新考虑您的数据库架构...
  • @JoranBeasley 不用担心。在项目的早期,我可以改变它。您如何建议存储一周中的天数并使用它们进行比较?
  • 只存储开始日期和结束日期的时间戳......这样你就拥有了所有信息
  • @JoranBeasley 我可以这样做...但是很多交易并不特定于特定日期,它们每周都会重复发生(例如,每周都会发生交易,周一至周三) ,这就是为什么我只将工作日存储在我的数据库中。如果我要存储时间戳,我可以用代码从中提取工作日,但我又回到了原来的问题。

标签: python django


【解决方案1】:

鉴于我建议使用的架构:

Deal.objects.filter(
  Q(deal_day_start__lte=current_day, deal_day_end__gte=current_day) | 
  Q(deal_day_start__lte=current_day, deal_day_end__lt=F("deal_day_start")) | 
  Q(deal_day_start__gte=current_day, deal_day_end__gte=current_day, deal_day_end__lt=F("deal_day_start"))
)

让我们观察一下,结束日期的交易必须小于开始日期。我们当天有 3 个案例属于交易期:

  • 如果当前日期介于开始日期和结束日期之间。
  • 如果当前日期大于开始日期但大于结束日期,则意味着交易必须结束。
  • 如果当前日期小于开始日期,则交易必须结束。但不仅会结束,而且会在当天之后完成。

【讨论】:

  • 评论不用于扩展讨论;这个对话是moved to chat
  • @foadster 我添加了解释。
猜你喜欢
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
相关资源
最近更新 更多