2015-01-28 4 views
1

테이블에 날짜 열이 있는데 특정 연도를 '필터링'/ 선택하고 싶습니다. 따라서 2010 년의 데이터가있는 경우 데이터를 표시하려는 '가장 빠른 날짜'로 '2011-10'을 지정하는 사용자 입력이 있습니다.Postgres/Ruby에서 날짜와 월 - 일을 비교하십시오.

나의 현재 SQL은 다음과 같습니다 다음 '어디'의 두 번째 부분에서

select round(sum(amount), 2) as amount, 
date_part('month', date) as month 
from receipts join items 
on receipts.item = items.item 
where items.expense = ? 
    and date_part('year', date)>=2014 
    and funding = 'General' 
group by items.expense, month, items.order 
order by items.order desc; 

대신 일을 해> = 2014, I는 다른 매개 변수로 to_char(date, 'YY-MMMM') >= ? 그런 짓을 한 다음에 전달하려면 '2011-10'. 나는이 할 때, :

costsSql = "select round(sum(amount), 2) as amount, 
to_char(date, 'YY-MMMM') as year_month 
from receipts join items 
on receipts.item = items.item 
where items.expense = ? 
    and year_month >= ? 
    and funding = 'General' 
group by items.expense, year_month, items.order 
order by items.order desc" 

을 내 두 PARAMS와 그 전화, 내가 포스트 그레스 오류 : PG::UndefinedColumn: ERROR: column "year_month" does not exist은.

편집 : YYYY-MM 문자열을 날짜로 변환하고이를 내 매개 변수로 전달하여 작동 중입니다. 그러나 나는 왜 내가 select 절에 그 컬럼을 생성 한 후에 '컬럼이 존재하지 않는다'라는 에러를 얻었는지 이해하지 못한다. 누군가 설명 할 수 있을까? where 절에서 사용되지 않는 것과 같이 생성 된 열은 사용할 수 있습니까?

+2

'date> =? :: date'을 사용하고 '2011-10-01'을 전달하는 것이 어떻습니까? – Andomar

답변

1

이 오류 : year_month가 WHERE 절에 SELECT 목록 및 별칭에 대해 참조 할 수없는 정의 된 별명 때문에 column "year_month" does not exist가 발생합니다.

이것은 SELECT 목록이 WHERE 절 다음에 평가된다는 사실을 기반으로합니다 (예 : Column alias in where clause?, PG 개발자 설명 참조).

그럼에도 불구하고 일부 데이터베이스는 허용하지만 일부는 허용하지 않으며 PostgreSQL은 허용하지 않습니다. SQL 엔진 간의 많은 이식성 위험 중 하나입니다.

질문에 표시된 쿼리의 경우 첫 번째 주석에서 언급했듯이 날짜와의 직접 비교가 더 간단하고 효율적이기 때문에 아무래도 WHERE 절에 to_char이 필요하지 않습니다.

쿼리에 SELECT 식 목록에 복잡한식이 있고 WHERE 절에서 반복되는식이 잘못 표시되면 쿼리의 시작 부분에서 식을 하위 선택 또는 WITH 절로 이동하도록 리팩토링 될 수 있습니다 .

관련 문제