提问人:sagar verma 提问时间:12/13/2022 最后编辑:sagar verma 更新时间:12/14/2022 访问量:100
Ruby-date 操作以获取数据
Ruby- date manipulation to fetch data
问:
我在 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
答:
1赞
Cpt.Hook
12/13/2022
#1
根据我的理解,计划从每个 5 日开始,并且您希望有从 到 的时间跨度,您可以通过以下内容获得开始日期 plan_start
NOW
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_time
DateTime
Customer.where('start_time > ? AND start_time < ?', start, today.end_of_day)
当然也可以,因为本专栏提供了所需的信息......可用性取决于 Rails 版本,但如上所述的手动增加应该很容易......created_at
end_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
根据您上次的结果编辑了答案。
评论
plan_start_date
active_record