2011-09-14 9 views
3

현재 내 테이블에는 날짜와 시간을 저장할 열이 있습니다. 해당 열의 데이터 유형은 시간대가 인 시간 소인입니다. 따라서 값은 '2011-09-13 11:03:44.537' 형식입니다.타임 스탬프 열에서 날짜 범위 선택

날짜와 관련하여 행을 검색해야합니다. 내가 사용하는 경우 : '44.537를 : 03 2011-09-13 11'과 '2011-09-12 11 : 03 : 44.537'

select * from table where mdate >= '2011-09-13 11:03:44.537' 
         and mdate <= '2011-09-12 11:03:44.537' 

그 사이에있는 값을 제공 할 것입니다.

그러나 내가 함께 갈거야 경우 : 날짜, 월, 초없이

select * from table where mdate >= '2011-09-13 00:00:00.0' 
         and mdate <= '2011-09-12 00:00:00.0' 

, 그것은 행을 표시하지 않습니다.

날짜와 관련하여이 테이블에서 값을 가져 오는 방법 (날짜 만 포함,시, 분 및 초는 무시)?

에도 열이 타임 스탬프와 날짜가 나는 날짜 (타임 스탬프를 무시하거나 '2011-09-13 00:00:00.0'0에 시간, 분, 초를 만드는) 만을 검색해야합니다.

답변

4

date 필드의 값을 date으로 캐스팅하려는 경우 비교를 위해 열의 모든 단일 값을 캐스팅해야하고 간단한 인덱스를 사용할 수 없으므로 성능이 저하됩니다. 당신은 너무 같은 특정 index on the expression을 만들어야 할 것입니다 :이 경우

CREATE INDEX some_idx ON tbl (cast(mdate AS date)); 

이 쿼리도 단순화해야합니다

SELECT * FROM tbl WHERE mdate::date = '2011-09-12'::date; -- 2nd cast optional 

그러나, 멀리 볼 수있는, 문제가있다 귀하의 질의에 간단한 오자/thinko :
위는 & 낮은 경계을 바꿨다. 당신의 구문을 단순화하고보다 정확한 것으로,

SELECT * FROM tbl WHERE mdate >= '2011-09-12 00:00:00.0' 
        AND mdate <= '2011-09-13 00:00:00.0';

또는 : '0

  • 당신은 돈이다 초 분수를 밖으로 철자 할 필요가 없습니다

    SELECT * FROM tbl WHERE mdate >= '2011-09-12 00:00' 
            AND mdate < '2011-09-13 00:00'; 
    
    • 시도 2011-09-13 00:00을 포함하려면 <= 대신 <을 사용하십시오.
      같은 이유로, 여기 BETWEEN를 사용하지 마십시오 :이 다음 날 00:00이 포함됩니다

      
                       
           
             WHERE mdate BETWEEN '2011-09-12 00:00' AND '2011-09-13 00:00' 
           

      .

    또한 유형 timestamp [without time zone]의 열이 현재 시간대 설정에 따라 해석되는 것을주의해야합니다. 날짜 부분은 일반적으로 예상대로 작동해야하는 설정에 따라 다릅니다. 자세한 내용 :
    Ignoring timezones altogether in Rails and PostgreSQL

  • 1

    그냥 날짜로 타임 스탬프를 치료 :

    select * 
    from table 
    where mdate::date >= DATE '2011-09-12' 
        and mdate::date <= DATE '2011-09-13' 
    

    표현 mdate::date는 값에서 시간 부분을 제거하는 date 유형에 타임 스탬프를 캐스팅합니다.

    DATE '2011-09-13'은 모든 언어 설정의 영향을받지 않으므로 '2011-09-13'이라고 쓰는 것보다 약간 튼튼합니다 (표준) 날짜 리터럴입니다.

    +0

    고마워요 ... 그것은 나를 .... –

    +0

    'mdate :: date'와'날짜 mdate' 동의어 아칸소 도왔다. ''2011-09-13 ':: date'과'date'2011-09-13''은 동의어입니다. 구문 스타일이 다릅니다. 차이가있는 것처럼 보입니다. –

    +0

    @ 에윈 : "2011-09-13"은 시스템 설정에 의존하지 않습니까? 한 번의 설치에서는 작동하지만 다른 한 번의 설치에서는 작동하지 않습니까? –