2013-01-25 1 views
0

time_created 및 time_ended는 VARCHAR 필드입니다.INTERVAL DAY TO SECOND 데이터 유형 : 1 분보다 큰 값 찾기

SQL 문

SELECT time_created, 
    time_ended, 
    TO_TIMESTAMP (time_ended, 'YYYY/MM/DD-HH24:MI:SS:FF9') 
    - TO_TIMESTAMP (time_created, 'YYYY/MM/DD-HH24:MI:SS:FF9') 
    FROM trans 

출력

2012/10/28-18:46:13.855 2012/10/28-18:47:43.357 +00 00:01:29.502000 
2012/10/20-22:40:10.363 2012/10/20-22:40:35.265 +00 00:00:24.902000 
2012/10/20-22:40:08.951 2012/10/20-22:40:24.717 +00 00:00:15.766000 
2012/10/20-22:40:09.454 2012/10/20-22:40:28.217 +00 00:00:18.763000 
2012/10/20-22:40:09.912 2012/10/20-22:40:31.767 +00 00:00:21.855000 
2012/10/22-10:11:29.360 2012/10/22-10:14:08.692 +00 00:02:39.332000 
2012/10/22-10:11:08.335 2012/10/22-10:11:43.781 +00 00:00:35.446000 
2012/10/20-22:40:07.900 2012/10/20-22:40:17.508 +00 00:00:09.608000 
2012/10/20-22:40:08.469 2012/10/20-22:40:21.144 +00 00:00:12.675000 
2012/10/22-11:00:42.355 2012/10/22-11:01:41.706 +00 00:00:59.351000 
2012/10/22-10:11:09.268 2012/10/22-10:11:54.185 +00 00:00:44.917000 
2012/10/22-10:11:13.072 2012/10/22-10:12:21.365 +00 00:01:08.293000 

내가 원하는 곳 일분 나보다 레코드 만 더 보여줍니다 절.

Sun Solaris에서 Oracle Database 10g를 사용합니다.

답변

2

는 차이 열 별칭을 경우, 외부 선택이 랩 단지 where 절 추가 할 수 있습니다

with trans as (
select '2012/10/28-18:46:13.855' time_created, 
    '2012/10/28-18:47:43.357' time_ended from dual 
union all select '2012/10/20-22:40:10.363', '2012/10/20-22:40:35.265' from dual 
union all select '2012/10/20-22:40:08.951', '2012/10/20-22:40:24.717' from dual 
union all select '2012/10/20-22:40:09.454', '2012/10/20-22:40:28.217' from dual 
union all select '2012/10/20-22:40:09.912', '2012/10/20-22:40:31.767' from dual 
union all select '2012/10/22-10:11:29.360', '2012/10/22-10:14:08.692' from dual 
union all select '2012/10/22-10:11:08.335', '2012/10/22-10:11:43.781' from dual 
union all select '2012/10/20-22:40:07.900', '2012/10/20-22:40:17.508' from dual 
union all select '2012/10/20-22:40:08.469', '2012/10/20-22:40:21.144' from dual 
union all select '2012/10/22-11:00:42.355', '2012/10/22-11:01:41.706' from dual 
union all select '2012/10/22-10:11:09.268', '2012/10/22-10:11:54.185' from dual 
union all select '2012/10/22-10:11:13.072', '2012/10/22-10:12:21.365' from dual 
) 
SELECT * FROM (
    SELECT time_created, 
     time_ended, 
     TO_TIMESTAMP (time_ended, 'YYYY/MM/DD-HH24:MI:SS:FF9') 
      - TO_TIMESTAMP (time_created, 'YYYY/MM/DD-HH24:MI:SS:FF9') AS diff 
    FROM trans 
) 
WHERE diff > INTERVAL '1' MINUTE 

TIME_CREATED   TIME_ENDED    DIFF 
----------------------- ----------------------- ------------------------------ 
2012/10/28-18:46:13.855 2012/10/28-18:47:43.357 +000000000 00:01:29.502000000 
2012/10/22-10:11:29.360 2012/10/22-10:14:08.692 +000000000 00:02:39.332000000 
2012/10/22-10:11:13.072 2012/10/22-10:12:21.365 +000000000 00:01:08.293000000 

3 rows selected. 
: CTE를 채워 당신의 출력을 일치 더미 데이터로

SELECT * FROM (
    SELECT time_created, 
     time_ended, 
     TO_TIMESTAMP (time_ended, 'YYYY/MM/DD-HH24:MI:SS:FF9') 
      - TO_TIMESTAMP (time_created, 'YYYY/MM/DD-HH24:MI:SS:FF9') AS diff 
    FROM trans 
) 
WHERE diff > INTERVAL '1' MINUTE 

+0

알렉스. 감사합니다. 유일한 litte 것은 : 별칭 "diff"는 where 절에서 작동하지 않습니다. 나는 완전한 명령을 내려야한다. ** 정확히 내가 무엇을 찾고 있었는지 ** –

+1

@ fyodor78 - 컬럼 별칭은 정의 된 것과 같은 수준의'where' 절에서 작동하지 않습니다. 그 이유는 내부 (원래) 쿼리에서'diff' 값을 사용할 수있는 외부'select'를 두는 이유입니다. 그러나 한 수준에서 모든 것을 작성하는 것이 좋을뿐입니다. 나는 이것이 조금 더 명확해질 것이라고 생각했습니다. (또한 ... 'varchar2' 필드에 타임 스탬프 (또는 다른 것)를 저장하지 말고 항상 올바른 데이터 형식을 사용하십시오. 여기에는 많은 차이가 없지만 좋은 습관은 아닙니다. –

관련 문제