복붙노트

[RUBY-ON-RAILS] 날짜 필드에 연도, 일 또는 월함으로써 액티브 찾기

RUBY-ON-RAILS

날짜 필드에 연도, 일 또는 월함으로써 액티브 찾기

나는 날짜 속성이있는 액티브 모델을 가지고있다. 이 가능한가 년, 월과 일에 의해 발견 날짜 속성을 사용합니다 :

Model.find_by_year(2012)
Model.find_by_month(12)
Model.find_by_day(1)

아니면 (2012년 12월 1일) find_by_date 단순히 할 수있다.

내가 년, 월, 일 속성을 만드는 피할 수있는 기대했다.

해결법

  1. ==============================

    1.당신의 "날짜 속성이"당신에게 줄 것이다 다음 간단한 날짜 (보다는 전체 타임 스탬프)이라고 가정하여 "날짜별로 찾아"

    당신의 "날짜 속성이"당신에게 줄 것이다 다음 간단한 날짜 (보다는 전체 타임 스탬프)이라고 가정하여 "날짜별로 찾아"

    Model.where(:date_column => date)
    

    그 대부분 하나 개의 결과에서 줄 것이다 같이 find_by_date_column 싶지 않아요.

    년, 월, 일 쿼리의 경우에는 추출 SQL 함수를 사용하고자하는 것입니다 :

    Model.where('extract(year  from date_column) = ?', desired_year)
    Model.where('extract(month from date_column) = ?', desired_month)
    Model.where('extract(day   from date_column) = ?', desired_day_of_month)
    

    당신이 SQLite는을 사용하는 경우는 추출물이 무엇인지 알지 못하기 때문에, 당신은 주위의 strftime 엉망해야 할 것이다 :

    Model.where("cast(strftime('%Y', date_column) as int) = ?", desired_year)
    Model.where("cast(strftime('%m', date_column) as int) = ?", desired_month)
    Model.where("cast(strftime('%d', date_column) as int) = ?", desired_day_of_month)
    

    m은 % 및 % D 형식 지정은 몇몇 경우에 선행 제로를 추가 할 것이며, 그 번호에 포맷 문자열을 강제 (int로서 ...) 동등 검사, 따라서 주조를 혼동 할 수있다.

    액티브는, 당신도 (필요 때로는 추악하지만) 자신의 휴대 층을 구축해야 너무 빨리 당신이 아무것도 아닌 사소한를하는 것처럼 데이터베이스 사이의 모든 차이로부터 보호 (데이터베이스 제한된로하지 않는 한 현실적인 자신을 묶어하지 않습니다 당신은)) 데이터베이스에서 실행 또는 데이터의 비 사소한 금액 (루비에 미친 모든 로직을 할 무언가를 출시하고 있습니다.

    년, 월, 일 - 중 - 달 쿼리는 꽤 느린 큰 테이블에있을 것입니다. 일부 데이터베이스는 기능 결과에 인덱스를 추가하지만 액티브는 당신이 그들을 사용하려고하면 그것은 큰 혼란을 만들 수 있도록 그들을 이해하기에 너무 바보하자; 당신이이 쿼리가 너무 느린 것을 발견하는 경우 그렇다면, 당신은 당신이 피하기 위해 노력하고있는 세 가지 여분의 열을 추가해야합니다.

    당신은 많은 당신이 그들을하지만 인수 범위를 추가 할 수있는 권장되는 방법에 대한 범위를 추가 할 수 이러한 쿼리를 사용하는 것입니다려고하는 경우에 단지 클래스 메소드를 추가합니다 :

    당신은 다음과 같이 클래스의 방법이있을 것이다 그래서 :

    def self.by_year(year)
        where('extract(year from date_column) = ?', year)
    end
    # etc.
    
  2. ==============================

    2.데이터베이스 독립적 인 버전 ...

    데이터베이스 독립적 인 버전 ...

    def self.by_year(year)
      dt = DateTime.new(year)
      boy = dt.beginning_of_year
      eoy = dt.end_of_year
      where("published_at >= ? and published_at <= ?", boy, eoy)
    end
    
  3. ==============================

    3.모델의 :

    모델의 :

    scope :by_year, lambda { |year| where('extract(year from created_at) = ?', year) }
    

    당신의 컨트롤러에서 :

    @courses = Course.by_year(params[:year])
    
  4. ==============================

    4.MySQL의 경우이 밖으로 시도

    MySQL의 경우이 밖으로 시도

    Model.where("MONTH(date_column) = 12")
    Model.where("YEAR(date_column) = 2012")
    Model.where("DAY(date_column) = 24")
    
  5. ==============================

    5.나는이 작업을 수행하는 가장 쉬운 방법은 범위라고 생각합니다 :

    나는이 작업을 수행하는 가장 쉬운 방법은 범위라고 생각합니다 :

    scope :date, lambda {|date| where('date_field > ? AND date_field < ?', DateTime.parse(date).beginning_of_day, DateTime.parse(date).end_of_day}
    

    이처럼 사용

    Model.date('2012-12-1').all
    

    즉, 전송 날짜의 시작과 하루의 끝 사이에 DATE_FIELD 모든 모델을 반환합니다.

  6. ==============================

    6.이 시도:

    이 시도:

    Model.where("MONTH(date_column) = ? and DAY(date_column) = ?", DateTime.now.month, DateTime.now.day)
    
  7. ==============================

    7.응용 프로그램 / 모델 / your_model.rb

    응용 프로그램 / 모델 / your_model.rb

    scope :created_in, ->( year ) { where( "YEAR( created_at ) = ?", year ) }
    

    용법

    Model.created_in( 1984 )
    
  8. ==============================

    8.I BSB의 대답처럼하지만 범위로

    I BSB의 대답처럼하지만 범위로

    scope :by_year, (lambda do |year| 
      dt = DateTime.new(year.to_i, 1, 1)
      boy = dt.beginning_of_year
      eoy = dt.end_of_year
      where("quoted_on >= ? and quoted_on <= ?", boy, eoy)
    end)
    
  9. ==============================

    9.이것은 또 다른 하나가 될 것입니다 :

    이것은 또 다른 하나가 될 것입니다 :

    def self.by_year(year)
      where("published_at >= ? and published_at <= ?", "#{year}-01-01", "#{year}-12-31")
    end
    

    SQLite는 나를 위해 꽤 잘 작동합니다.

  10. ==============================

    10.추출 방법에 대한 필요, 이것은 PostgreSQL의에서 마법처럼 작동합니다 :

    추출 방법에 대한 필요, 이것은 PostgreSQL의에서 마법처럼 작동합니다 :

    text_value = "1997" # or text_value = '1997-05-19' or '1997-05' or '05', etc
    sql_string = "TO_CHAR(date_of_birth::timestamp, 'YYYY-MM-DD') ILIKE '%#{text_value.strip}%'"
    YourModel.where(sql_string)
    
  11. ==============================

    11.아래와 같이 또 다른 짧은 범위 :

    아래와 같이 또 다른 짧은 범위 :

      class Leave
        scope :by_year, -> (year) {
          where(date:
                    Date.new(year).beginning_of_year..Date.new(year).end_of_year)
        }
      end
    

    범위 전화 :

    Leave.by_year(2020)
    
  12. ==============================

    12.에서 PostgreSQL의 V 11 + (내가 테스트 한) 방식으로 작동 아래

    에서 PostgreSQL의 V 11 + (내가 테스트 한) 방식으로 작동 아래

    Model.where('extract(year  from date_column::date) = ?', desired_year)
    Model.where('extract(month from date_column::date) = ?', desired_month)
    Model.where('extract(day   from date_column::date) = ?', desired_day_of_month)
    
  13. from https://stackoverflow.com/questions/9624601/activerecord-find-by-year-day-or-month-on-a-date-field by cc-by-sa and MIT license