ABAP TIMESTAMP 총정리
타임스탬프로 사용되는 타입은 두가지가 있습니다.
TIMESTAMP : 15자리 YYYYMMDDhhmmss
TIMESTAMPL : 21자리 YYYYMMDDhhmmss.ssssss
주로 사용하는 15자리 TIMESTAMP 를 기준으로 설명하겠습니다.
예를 들어 인천 에서 홍콩으로 가는 항공편의 출발시간, 도착시간을 보면서 타임스탬프의 필요성을 이해해 보도록 하게습니다.
출발시간 | 도착시간 | |
현지 시간 | 2022.01.01 09:00:00 | 2022.01.01 12:00:00 |
타임존 | UTC+9 | UTC+8 |
타임스탬프 (UTC 기준 시간) | 2022.01.01 00:00:00 | 2022.01.01 04:00:00 |
출발지(UTC+9) 기준 시간 | 2022.01.01 09:00:00 | 2022.01.01 13:00:00 |
도착지(UTC+8) 기준 시간 | 2022.01.01 08:00:00 | 2022.01.01 12:00:00 |
보통 표시할때는 현지 시간 + 타임존 으로 표시를 합니다. 그게 이해하기 쉬우니까요. 인천 9시 출발, 홍콩 12시 도착 입니다.
그럼 비행시간을 계산하려면 어떻게 할까요? 12-9는 3시간 틀렸습니다. 타임존이 다르기 때문이죠.
비행시간을 계산하기 위해서는 출발 도착 둘다 같은 타임존을 가지도록 값을 변환해야 합니다.
위 표에서 UTC 기준, 출발지 기준, 도착지 기준 3가지 모두 비행시간을 계산할때 사용할 수 있습니다.
DB에 저장할때는 어떤값을 저장하는게 효과적일까요?
정답은 타임스탬프(=UTC 기준 시간) 입니다. 다른경우와 다르게 타임존을 저장할 필요가 없기 때문에 더 작은 공간을 차지합니다.
타임존은 출발지와 도착지 각 장소별로 저장하면 됩니다.
이제 ABAP 문법을 알아 보겠습니다.
현재 타임스탬프 가져오는 방법:
GET TIME STAMP FIELD lv_ts.
타임스탬프를 날짜, 시간 두 필드로 변환하는 방법:
CONVERT TIME STAMP lv_ts TIME ZONE sy-zonlo INTO DATE lv_date TIME lv_time.
날짜,시간 두 필드를 타임스탬프로 변환하는 방법:
CONVERT DATE lv_date TIME lv_time INTO TIME STAMP lv_ts TIME ZONE sy-zonlo.
타임스탬프를 글자표현(예: YYYY.MM.DD hh:mm:ss) 으로 변환하는 방법:
|{ lv_ts TIMEZONE = sy-zonlo }|
타임스탬프 관련 유용한 conversion routine 을 소개 합니다.
'TSTLC' : 타임존 sy-zonlo 기준으로 표시합니다. 예를들어 데이터 엘리먼트는 EHFND_TIME_STAMP 가 있습니다.
'TSTPS' : 타임존 UTC 기준으로 표시합니다. 예를들어 데이터 엘리먼트는 BCOS_TSTMP 가 있습니다.
타임존 sy-zonlo 기준으로 표시 할때의 장점:
sy-zonlo는 사용자의 타임존입니다.
각자 티코드 SU3에서 변경 할 수 있습니다.
보통 DB 테이블 마다 들어가는 생성날짜와 생성시간을 sy-datum 과 sy-uzeit 값을 넣어서 기록합니다.
국제화 시대에 맞춰 타임스탬프로 기록하면 시스템 타임존과 다른 타임존을 사용하는 사용자도 편하게 볼수있습니다.
예를들어 타임스탬프 값이 2022.01.01 00:00:00 이라면,
UTC+9 타임존 사용자는 2022.01.01 09:00:00 로 표시되고,
UTC+8 타임존 사용자는 2022.01.01 08:00:00 로 표시됩니다.
다음은 DB 검색시 타임스탬프로 기록된 필드를 검색하는 방법 입니다.
FUNCTION zconvert_range_date2ts.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(IT_RANGE_DATE) TYPE RANGE_DATE_T
*" EXPORTING
*" REFERENCE(ET_RANGE_TS) TYPE CRMT_BUS_TIMESTAMP_RANGE_T
*"----------------------------------------------------------------------
CONSTANTS: lc_time_end TYPE uzeit VALUE '235959'.
DATA: ls_range_date TYPE range_date,
ls_range_ts TYPE crmt_bus_timestamp_range.
CLEAR: et_range_ts.
LOOP AT it_range_date INTO ls_range_date.
CLEAR: ls_range_ts.
ls_range_ts-sign = ls_range_date-sign.
ls_range_ts-option = ls_range_date-option.
CASE ls_range_date-option.
WHEN 'EQ'.
ls_range_ts-option = 'BT'.
CONVERT DATE ls_range_date-low INTO TIME STAMP ls_range_ts-low TIME ZONE sy-zonlo.
CONVERT DATE ls_range_date-low TIME lc_time_end INTO TIME STAMP ls_range_ts-high TIME ZONE sy-zonlo.
WHEN 'NE'.
ls_range_ts-option = 'NB'.
CONVERT DATE ls_range_date-low INTO TIME STAMP ls_range_ts-low TIME ZONE sy-zonlo.
CONVERT DATE ls_range_date-low TIME lc_time_end INTO TIME STAMP ls_range_ts-high TIME ZONE sy-zonlo.
WHEN 'BT'
OR 'NB'.
CONVERT DATE ls_range_date-low INTO TIME STAMP ls_range_ts-low TIME ZONE sy-zonlo.
CONVERT DATE ls_range_date-high TIME lc_time_end INTO TIME STAMP ls_range_ts-high TIME ZONE sy-zonlo.
WHEN 'GE'.
CONVERT DATE ls_range_date-low INTO TIME STAMP ls_range_ts-low TIME ZONE sy-zonlo.
WHEN 'GT'.
CONVERT DATE ls_range_date-low TIME lc_time_end INTO TIME STAMP ls_range_ts-low TIME ZONE sy-zonlo.
WHEN 'LE'.
CONVERT DATE ls_range_date-low TIME lc_time_end INTO TIME STAMP ls_range_ts-low TIME ZONE sy-zonlo.
WHEN 'LT'.
CONVERT DATE ls_range_date-low INTO TIME STAMP ls_range_ts-low TIME ZONE sy-zonlo.
WHEN OTHERS.
CONTINUE.
ENDCASE.
APPEND ls_range_ts TO et_range_ts.
ENDLOOP.
ENDFUNCTION.