타임스탬프로 사용되는 타입은 두가지가 있습니다.

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.

 

 

 

+ Recent posts