首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Date.new的记录范围限制为每个月的几个星期?6

问如何将Date.new的记录范围限制为每个月的几个星期?6
EN

Stack Overflow用户
提问于 2020-06-25 13:25:47
回答 1查看 245关注 0票数 0

为了澄清,我正在构建一个包含三个参数的搜索,即月/年/周数。我需要知道如何根据传递的周数返回记录。例如,最有可能有5个星期。当我选择所有三个参数时,我应该得到7天或更短时间的记录。目前,我已经成功地按月/年检索了记录,但现在我将星期数作为参数引入。如何将周号传递给date.new对象?

index.html.erb

代码语言:javascript
复制
  <%= form_tag amb_chart_records_path, :method => :get, :class => "ui form" %>
    <div class="three fields">
     <div class="field">
      <%= select_month(@month.present? @month : nil, {:include_blank => "Select Month"...%>
    </div>
    <div class="field">
        <%= select_year(@year.present? ? @year : Date.today, {:include_blank => "Select Year"..%>
    </div>
    <div class="field">
      <%= select_tag :week, options_for_select([["Week 1", 1], ["Week 2", 2], ["Week 3", 3], ["Week 4", 4], ["Week 5", 5]], params[:week]), class: 'ui dropdown' %>
    </div>    
    </div>
  <div class="field text-center">
    <%= submit_tag("Search", :id => "button", :class => "ui button basic green" %>
  </div>
    <% end %>

amb_chart_records_controller.rb

代码语言:javascript
复制
def index
  if params[:commit] == "Previous" || params[:commit] == "Next"
    now = Date.new(params[:current_year].to_i, params[:current_month].to_i)
    if params[:commit] == "Previous"
      target_date = now - 1.month
    else
      target_date = now + 1.month
    end
  elsif params.has_key?(:select)
    target_date = Date.new(params[:select][:year].to_i, params[:select][:month].to_i, 1)
    week_numb = params[:select][:week].to_i
  else
    target_date = Date.new(Date.today.year, Date.today.month, 1)
    week_numb = 1
  end
  @year = target_date.year.to_i
  @month = target_date.month.to_i
  @week_numb = target_date.cweek.to_i
  @facilities = Facility.where(is_ambulatory_chart_enabled: true)
  @ambulatory_chart_records = @facilities.includes(:amb_chart_records).order(record_date: :desc).where(:record_date => target_date..target_date + 1.month)
end

def week(year, month, week_number)
  Date.new(year, month, 7 * week_number - 6)
end
EN

回答 1

Stack Overflow用户

发布于 2020-06-25 14:07:14

要在Ruby中获得一周的开始,请使用Date#commercial方法:

代码语言:javascript
复制
irb(main):019:0> Date.commercial(2020, 25, 1)
=> Mon, 15 Jun 2020

这假设每周从星期一开始。如果您需要从周日开始的ISO周,只需用#改变将日期更改一天即可。

代码语言:javascript
复制
irb(main):020:0> Date.commercial(2020, 25, 1).change(day: -1)
=> Tue, 30 Jun 2020

如果要根据周数进行查询,一种方法是在开始日期和结束日期之间传递一个范围:

代码语言:javascript
复制
w_start = Date.commercial(year, week_number, 1)
w_end = Date.commercial(year, week_number, 7)
Model.where(some_column: w_start..w_end)

作为一种较少的多角化解决方案,您还可以使用数据库中的日期函数从日期列中提取星期数:

代码语言:javascript
复制
# Postgres
User.where('EXTRACT(week from created_at)::int = ?', 26)
    .where('EXTRACT(year from created_at)::int = ?', 2020)

# MySQL
User.where('WEEK(created_at) = ?', 26)
    .where('YEAR(created_at) = ?', 2020)

如果您使用的是基于周的分组或聚合,则这更有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62576450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档