【问题标题】:Query for date part of date_time field. yyyy-mm-dd查询 date_time 字段的日期部分。 yyyy-mm-dd
【发布时间】:2021-03-24 18:08:33
【问题描述】:

我正在尝试查找是否有同一日期的帖子。

@selected_date = Date.new(params["post"]["date(1i)"].to_i,params["post"]["date(2i)"].to_i,params["post"]["date(3i)"].to_i)

@existing_post = Post.where(user_id: current_user.id, date: @selected_date).first

我的@selected_date 只包含日期2021-03-19,但我的日期数据库字段也包含时间date: "2021-03-19 17:43:50.640258000 +0000"

在查询中,我如何仅指向日期部分进行比较?当我做, date: @selected_date) 时,它试图在没有时间的情况下进行比较,所以它失败了。

【问题讨论】:

    标签: sql ruby-on-rails date ruby-on-rails-6


    【解决方案1】:

    您可以使用 all_day 助手来执行此操作,该助手会创建一个覆盖全天的范围。

    Post.find_by(user_id: current_user.id, date: @selected_date.all_day)
    

    【讨论】:

    • 太棒了!这行得通!我不知道有这样的方法!这就是 Ruby on Rails 的问题,有很多方法,很难知道或找到适合您需要的东西。
    【解决方案2】:

    至少有两种方法:

    1. 尊重数据库类型,并进行相应的查询:
    @existing_post = Post.where(
     user_id: current_user.id, 
     date: @selected_date.beginning_of_day..@selected_date.end_of_day # use @selected_date.all_day from Eyeslanduc's answer: https://stackoverflow.com/a/66787291/299774
    ).first
    

    这将查询当天 00:00:00 到 23:59:59 之间带有 date 的条目

    1. date列,好像真的是时间戳:
    @existing_post = Post
      .where(user_id: current_user.id) 
      .where("date_trunc('day', date)::date = ?", @selected_date).first
    

    .where("date::date = ?", @selected_date) 可能也一样。

    这会将date 列转换为date 类型,这应该会给你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      相关资源
      最近更新 更多