Ruby-date 操作以获取数据

Ruby- date manipulation to fetch data

提问人:sagar verma 提问时间:12/13/2022 最后编辑:sagar verma 更新时间:12/14/2022 访问量:100

问:

我在 ruby 中有一个要求,我想获取当月数据库中存在的所有数据。但是,有一个问题。 我想根据计划启动数据获取当月的数据。

Ex:
 1. My plan is started on 5th Oct 2022.
 2. Let say, today's date is 3rd Dec 2022. I would want to fetch records from 5th Nov to 3rd Dec.
 3. Let say, today's date is 15th Dec 2022. I would like to fetch records of current cycle that is from 5th Dec till today.

可能有很多情况,但这个想法是我想根据当前月份的周期开始日期获取当前月份的记录。

由于我是 ruby 的新手,有人可以建议我如何使用 DateTime 或任何相关方法做到这一点吗?任何帮助将不胜感激。

型:

class Customer
  include Mongoid::Document
  include Mongoid::Timestamps
  include SimpleEnum::Mongoid

  field :topic, type: String # This field is to store title/topic
  field :external_uuid, type: String # This represents unique ID
  field :start_time, type: DateTime
  field :duration, type: Integer
  field :created_at, type: DateTime 

  field :random, type: Float, default: -> { rand.round(8) }

  as_enum :type,
          internal: 'internal',
          external: 'external' 
end
Ruby-on-Rails 红宝石 日期时间 Ruby-on-Rails-4

评论

0赞 Cpt.Hook 12/13/2022
我还没有完全理解所有的要求。我的猜测是:“计划”总是从 5 日开始。而且您基本上需要从“过去 5 日到今天”的信息?您的数据是如何构建的?是否有专栏或类似专栏?所以你基本上需要传递到的日期范围?plan_start_dateactive_record
0赞 max 12/13/2022
请提供模型、架构、数据和预期结果的示例。这消除了您实际期望的结果的任何潜在歧义,并且实际上使问题可以回答。
1赞 max 12/13/2022
这不是一个实际的例子——它只是更无用的绒毛。提供现有数据的示例,以及您希望在结果中出现哪些行。一个很好的方法是使用一个简单的 ASCII 表。您也没有提供模型、架构或其他任何内容。
0赞 sagar verma 12/14/2022
对不起,这是错别字。我将在这里举个例子。
0赞 sagar verma 12/14/2022
每月定期计划从 : 2022 年 10 月 5 日开始,从 10 月 5 日至 11 月 4 日、11 月 5 日至 12 月 4 日以及从 12 月 5 日到今天添加记录。现在,我想查询数据以获取在同一个月的任何时间点插入了多少条记录。因此,如果我查询当月,我应该获取从 12 月 5 日到今天的数据。如果我查询上个月的日期,假设日期是 11 月 28 日作为当前日期,我应该得到从 11 月 5 日到 11 月 28 日的数据。我的模型存在created_at字段。其日期格式为“created_at:2022-12-12 07:26:57.286 UTC”。希望这有助于解释用例。

答:

1赞 Cpt.Hook 12/13/2022 #1

根据我的理解,计划从每个 5 日开始,并且您希望有从 到 的时间跨度,您可以通过以下内容获得开始日期 plan_startNOW

require 'date'

plan_start_day = 5
today = DateTime.now.to_date
puts "Today is #{today}"
puts "Today is day #{today.day} of the month, plan starts on #{plan_start_day}."

start =
    if today.day < plan_start_day 
         DateTime.new(today.year,today.month - 1,plan_start_day)
    else 
         DateTime.new(today.year,today.month,plan_start_day)
    end
puts "Applicable plan start is #{start.to_date}"

今天,我们得到一个这样的输出

Today is 2022-12-13
Today is day 13 of the month, plan starts on 5.
Applicable plan start is 2022-12-05

现在,假设您要查找的日期在列中,即 类型 ,您可以查询:start_timeDateTime

Customer.where('start_time > ? AND start_time < ?', start, today.end_of_day)

当然也可以,因为本专栏提供了所需的信息......可用性取决于 Rails 版本,但如上所述的手动增加应该很容易......created_atend_of_day

如果您只想让项目数量使用

Customer.where('start_time > ? AND start_time < ?', start, today.end_of_day).count

现在,我将它作为静态方法添加到模型类中Customer

def self.monthly_sum(date)
    month = (date.day < Customer::PLAN_START_DAY) : date.month - 1 ? date.month 
    plan_start = DateTime.new(date.year, month, Customer::PLAN_START_DAY)
    plan_end = DateTime.new(date.year, month+1, Customer::PLAN_START_DAY)
    Customer.where('start_time > ? AND start_time < ?', plan_start, plan_end).count
end

此方法使用没有“未来”事件的假设,因此它将获取任何日期的整个月份。如果plan_month已经结束,它将获取完整的数据。如果是当前plan_month,我们将获取直到今天的所有数据(因为不存在更新的条目)。

这里是一个常量。 如果计划开始是单个的(每个用户、类型、项目等),则需要从相应的记录中获取它,并使用上述方法提取日期。Customer::PLAN_START_DAY#day

你现在可以做到了

Customer.monthly_sum(DateTime.now)

或适用的任何日期,并获取匹配的记录数。

评论

0赞 sagar verma 12/14/2022
是的,我的模型有created_at,我可以使用您共享的逻辑。一个查询,它是否也适用于 DateTime 字段。由于created_at是 DateTime 字段。
0赞 Cpt.Hook 12/14/2022
如前所述,这应该可以工作,是的。;)(“应该”,因为如果没有上述评论中要求的信息,我无法真正重现您的问题。
0赞 sagar verma 12/14/2022
还添加了模型结构。
0赞 Cpt.Hook 12/14/2022
根据您上次的结果编辑了答案。