2015-01-07 6 views
0

나는 원하는 다양한 형식으로 타임 스탬프를 업로드 할 수있는 sql loader에 대한 작업 제어 파일을 가지고 있습니다.SQL Loader UNIX 시간의 타임 스탬프

my_timestamp TIMESTAMP \"dd-MON-yy hh.mi.ss.ff6 PM\", 

는하지만 내 DB에서 번호 필드에 밀리 초 단위로 내 .csv 파일에서 타임 스탬프를 업로드합니다. 이것이 가능하다면 어떤 제안이 있나?

+0

당신이 타임 스탬프의 밀리 초 부분을 넣어 의미 숫자 열로? –

답변

0

밀리 초 부분을 제거하고 별도로 저장한다고 가정합니다.

테스트되지 않은 :

... 
my_timestamp TIMESTAMP "dd-MON-yy hh.mi.ss.ff6 PM" 
my_milliseconds NUMBER  "regexp_substr(:my_timestamp, '\.(\d+) ', 1,1,null,1)" 
... 

하지만이 작업을해야하므로 위의 작동 하나 개 이상의 숫자의 문자열의 패턴과 일치하는

select regexp_substr('07-JAN-14 04.24.00.123456 PM', '\.(\d+) ', 1,1,null,1) 
from dual; 

는 (괄호로 둘러싸인) 첫 번째 그룹을 반환 왼쪽에있는 기간과 오른쪽에있는 공간으로 둘러싸여 있습니다.

편집 : 아, 1970 년 1 월 1 일 0 : 0 : 0 (신기원) 이후의 초 수인 UNIX 시간으로 전체 시간 소인을 변환해야합니다.

먼저 날짜를 UNIX 시간으로 변환 할 수식이 필요합니다. 약간의 인터넷 검색 결과 :

SELECT (cast(to_timestamp('14.03.2010 08:16:22.123456 AM','dd.mm.yyyy hh:mi:ss.FF6 AM')as date) - TO_DATE('01/01/1970 00:00:00', 'MM-DD-YYYY HH24:MI:SS')) * 
24 * 60 * 60 
FROM DUAL; 

결과는 '1268554582'가됩니다. 이 유닉스 시간을 에포크 변환기를 사용하는 날짜로 다시 변환 : http://www.epochconverter.com/ 올바른 날짜가 반환되었음을 확인했습니다.

제어 파일에서 사용하는 방법은 무엇입니까? 위와 같이 선택 할 수 있다면, 다음과 같이 제어 파일에 넣을 수 있습니다

... 
my_timestamp TIMESTAMP "dd-MON-yy hh.mi.ss.ff6 PM" 
my_unixtime  NUMBER  "(cast(:my_timestamp)as date) - TO_DATE('01/01/1970 00:00:00', 'MM-DD-YYYY HH24:MI:SS')) * 
24 * 60 * 60" 
... 

당신은 EXPRESSION 키워드를해야 할 수도 있습니다, 잘 모르겠어요 :

my_unixtime NUMBER EXPRESSION "(cast(:my_timestamp)as date) - TO_DATE('01/01/1970 00:00:00', 'MM-DD-YYYY HH24:MI:SS')) * 
24 * 60 * 60" 

이제 작동이 하나의 열, 그러나 많은 것이 있거나 이것을 재사용하고 싶다면?

... 
my_timestamp TIMESTAMP "dd-MON-yy hh.mi.ss.ff6 PM" 
my_unixtime  NUMBER  "my_timestamp_to_unix_converter(:my_timestamp)" 
... 

주의 사항 :

밀리으로 손실 재사용 및 유지 보수를 들어, 타임 스탬프를 받아 위의 언급 대신 제어 파일에서 해당 전화로 unixtime 반환하는 함수를 사용하여 한 곳에서 코드를 넣어 UNIX 시간은 밀리 초가 아닌 1970 년 1 월 1 일 이후의 초입니다. 밀리 초가 중요한 경우 위와 같이 별도로 저장해야 할 수 있습니다.

문제가 될 수 있을까요 때 주변에 2038 년 롤 : http://en.wikipedia.org/wiki/Year_2038_problem

자료 :

http://www.epochconverter.com/

http://orcasoracle.squarespace.com/oracle-rdbms/2009/10/9/converting-timestamp-to-date.html

https://community.oracle.com/thread/1045221

+0

안녕하세요 게리, 나는 당신이 제안한 것을 가지고 놀았습니다.내 목표는 주어진 시간 소인을 유닉스 시간 스탬프로 변환 한 다음 새 테이블에 업로드하는 것이 었습니다. 나는 ms를 원하지 않지만, 모든 것을 unix_timestamp로 변환한다. 이것은 jan-01-1970을 시작한다. – Purpamine

+0

내 게시물을 더 많은 정보로 업데이트했습니다. 이것은 운동하기에 재미있었습니다. –

+0

정말 고마워요. 정확히 제가 찾고 있던 것입니다. 나는 이것을하기위한 대안적인 방법을 찾아 냈지만,이 방법은 훨씬 더 빠르고 직선적이다. 나는 그것을 지금 시행 할 것이다. :) – Purpamine