[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.당신의 "날짜 속성이"당신에게 줄 것이다 다음 간단한 날짜 (보다는 전체 타임 스탬프)이라고 가정하여 "날짜별로 찾아"
당신의 "날짜 속성이"당신에게 줄 것이다 다음 간단한 날짜 (보다는 전체 타임 스탬프)이라고 가정하여 "날짜별로 찾아"
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.데이터베이스 독립적 인 버전 ...
데이터베이스 독립적 인 버전 ...
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.모델의 :
모델의 :
scope :by_year, lambda { |year| where('extract(year from created_at) = ?', year) }
당신의 컨트롤러에서 :
@courses = Course.by_year(params[:year])
-
==============================
4.MySQL의 경우이 밖으로 시도
MySQL의 경우이 밖으로 시도
Model.where("MONTH(date_column) = 12") Model.where("YEAR(date_column) = 2012") Model.where("DAY(date_column) = 24")
-
==============================
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.이 시도:
이 시도:
Model.where("MONTH(date_column) = ? and DAY(date_column) = ?", DateTime.now.month, DateTime.now.day)
-
==============================
7.응용 프로그램 / 모델 / your_model.rb
응용 프로그램 / 모델 / your_model.rb
scope :created_in, ->( year ) { where( "YEAR( created_at ) = ?", year ) }
용법
Model.created_in( 1984 )
-
==============================
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.이것은 또 다른 하나가 될 것입니다 :
이것은 또 다른 하나가 될 것입니다 :
def self.by_year(year) where("published_at >= ? and published_at <= ?", "#{year}-01-01", "#{year}-12-31") end
SQLite는 나를 위해 꽤 잘 작동합니다.
-
==============================
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.아래와 같이 또 다른 짧은 범위 :
아래와 같이 또 다른 짧은 범위 :
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.에서 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)
from https://stackoverflow.com/questions/9624601/activerecord-find-by-year-day-or-month-on-a-date-field by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일 쿠키 설정 시작 날짜와 만료 날짜 (0) | 2020.02.11 |
---|---|
[RUBY-ON-RAILS] 루비 사람의 나이를 받기 (0) | 2020.02.11 |
[RUBY-ON-RAILS] 컬 인증서 오류 때 루비 1.9.2 설치 RVM을 사용하여 (0) | 2020.02.11 |
[RUBY-ON-RAILS] 레일 응용 프로그램에서 쿠키 오버 플로우? (0) | 2020.02.11 |
[RUBY-ON-RAILS] 3 SSL 중단 레일 (0) | 2020.02.11 |