2010-02-26 5 views
10

DATE 열이있는 테이블이 있습니다. d.오라클 : 날짜로만 시간 비교

날짜에 관계없이 d 열이 어떤 값보다 크거나 작은 모든 행을 가져오고 싶습니다. 나는 모든 레코드를 표시하려는 경우 예를 들어

예를 들어
|  d   | 
------------------- 
|2009/11/1 15:55:23| 
-------------------- 
|2009/11/2 15:55:23| 
-------------------- 
|2009/11/3 15:55:23| 
-------------------- 
|2009/11/3 17:55:23| 
-------------------- 

5시 이후 :

select d 
from my_table 
where extract(hour from d) > TO_DATE ('17:00:00','HH24:MI:SS') 

이것은 '

|2009/11/3 17:55:23| 

내가 돈 하나의 레코드 만 반환해야 이것이 최선의 방법인지는 모르겠지만 추출 기능에 오류가 발생합니다 :

ORA-30076: invalid extract field for extract source 
Cause: The extract source does not contain the specified extract field. 

더 좋은 방법이 있나요? 오류가 무엇입니까? 내가 찾은 모든 예 에서처럼 sysdate에서만 추출 할 수 있습니까?

+0

그래서 HOUR 필드와 EXTRACT로 작업하는 일반적인 솔루션을 찾았습니까? 이를 위해 DBMS와 호환되는 교차 솔루션이 필요합니다. –

답변

12

?

select d 
from my_table 
where to_char(d,'HH24') > '16'; 
+0

그런데 '시간'은 Google 검색을 기반으로하는 타임 스탬프 유형에만 지원됩니다. 이 경우 성능이 중요합니까? 그냥 궁금해서. – exiter2000

+0

예, 성능 문제가 있습니다. – Tom

+2

위의 표현식에서 함수 기반 인덱스를 고려하십시오. 'my_table (to_char (date_col,'HH24 '));'에서 CREATE INDEX my_table_fbi01 그러나 예제에 따르면 성능은 여전히 ​​최적이 아닐 것입니다. 날짜 열의 시간별 패턴에 차이가 없다고 가정하면 여전히 데이터의 1/3을 얻게되므로 인덱스가 도움이되지 않습니다. –

4

이 시도 사전에

감사 :이 방법에 대해

select d from my_table 
where (d-trunc(d)) > 16/24; 
7

순간에 함께 테스트하기 위해 Oracle 데이터베이스를 가지고 있지만 나는 다음과 같은 일을해야 생각하지 마십시오

SELECT * 
    FROM MY_TABLE t 
    WHERE EXTRACT(HOUR FROM CAST(t.D AS TIMESTAMP)) > 16; 

그러나 나는 CAST가 this page으로 필요한 이유를 이해하지 못하는 말한다 HOUR은 DATE의 유효한 필드입니다.

공유하고 즐기십시오.

+1

이 [페이지] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions052.htm)에서는 TIMESTAMP로 변환해야하는 이유를 설명합니다. _ "EXTRACT는 expr을 ANSI datetime 데이터 유형으로 해석합니다. 예를 들어, EXTRACT는 시간 요소없이 DATE를 레거시 Oracle DATE가 아닌 ANSI DATE로 취급합니다. " –