2012-08-27 2 views
3

나는 effective_date이라는 이름의 필드를 가진 PostgreSQL 테이블을 가지고 있으며 데이터 타입은 정수 (신기원 날짜)입니다. 내가하고 싶은 일은 내가 선택한 effective_date가있는 항목 만 선택하는 것입니다 (한 달에 한 번만 쿼리하려고합니다). 테이블에 선택 기준과 일치하는 항목이 많지만 내 쿼리가 아래에 있으며 문제는 아무 것도 반환하지 않습니다.PostgreSQL의 to_char() 문제

$query = "select * 
      from ". $this->getTable() ." 
      where pay_stub_entry_name_id = 43 
      AND to_char(effective_date, 'Mon') = 'Jul' 
      AND deleted = 0"; 
+0

잠깐만 요, 당신은'effective_date'가'integer' 데이터 타입을 가지고 있다고 말했습니까? '날짜'가 아닌가요? '타임 스탬프'가 아닌가요? 귀하의 질문에 실수였습니까? 그것이 정수라면 어떻게 그것에서 날짜를 얻을 것으로 예상합니까? 그것은 획기적인 날짜입니까? (특정 날짜 이후 초)? –

+0

@Craig 죄송합니다. 실수입니다. 네, 그것은 신기원입니다. – Thili

+0

그럼,'to_char'는 어떻게할까요? 'psql'에서 해봤습니까? 'select to_char (extract (current_timestamp에서의 신기원), 'Mon')'은 단지'Jul'이라는 문자열과 결코 같지 않을'Mon' 문자열을 출력합니다. 그래서 문제가 있습니다, 당신은'to_char'의 정수 버전을 호출하고 정수를 날짜로 취급하기를 원한다는 것을 알기를 기대합니다. 모든 to_char 변종을 보려면 psql의'\ df to_char'를보십시오. 'timestamp' 만이 [documentation] (http://www.postgresql.org/docs/current/static/functions-formatting.html) –

답변

3

to_char 대신 extract(month from the_date)을 사용하십시오. datetime functions in the Pg docs을 참조하십시오.

to_char으로 대소 문자, 현지화 등의 모든 문제가 발생합니다. 당신이 effective_date의 데이터 유형이 timestamp 또는 date 것을 의미 가정

, 당신은 쓸 것 :

$query = "select * 
     from ". $this->getTable() ." 
     where pay_stub_entry_name_id = 43 
     AND extract(month from effective_date) = 7 
     AND deleted = 0"; 

를 그 다음 integer을 있다면 - 그것은 획기적인 일이다 가정 - 당신이 타임 스탬프로 변환해야 to_timestamp을 입력 한 다음 extract을 사용하십시오. 위의 링크 된 문서, 예에 epoch 섹션을 참조하십시오 : 문제의

$query = "select * 
     from ". $this->getTable() ." 
     where pay_stub_entry_name_id = 43 
     AND extract(month from to_timestamp(effective_date)) = 7 
     AND deleted = 0"; 

직접적인 원인은 정수 시대 날짜가 to_char(integer,text)를 호출 한 것이 었습니다. to_chartimestamp 버전 만 날짜 형식을 지정합니다. Mon은 다른 것들에는 특별한 것이 아니므로 리터럴 문자열 Mon으로 출력됩니다. 비교 :

regress=# SELECT to_char(current_timestamp, 'Mon'); 
to_char 
--------- 
Aug 
(1 row) 

regress=# select to_char(extract(epoch from current_timestamp), 'Mon'); 
to_char 
--------- 
Mon 
(1 row) 

SQL injection을 피하기 위해 실제 검색어 버전을 매개 변수로 설정해야합니다.