Amazon Athena (Presto 0.172)에서 날짜를 비교하여 지난 달 이후의 데이터 검색

3089 단어 AthenaPresto

하고 싶은 일


  • Athena를 사용할 때 SQL에서 날짜를 비교하고 싶습니다
  • "지난 달 이후의 데이터를 원한다"같은 일을하고 싶다

  • 설명



    ※ 문중 base_date 는 date형

    MySQL 등의 노리로, 날짜를 timestamp 형으로 해
     base_date >='2019-05-01' 
    

    라는 느낌으로 해도

    '>=' cannot be applied to timestamp

    그리고 화가납니다.
     base_date>= CAST('2019-05-01' AS TIMESTAMP)
    

    어쨌든 할 수 있습니다.

    또한 같은 Presto에서도 Treasure Data의 경우 날짜의 고유 함수가 있지만 Amazon Athena에는 물론 그런 것은 없으므로 Presto 0.172를 따라 어떻게든 가야합니다.

    htps : // / cs. 아 ws. 아마존. 이 m / 그럼 _ jp / 아테나 / 아 st / 우 g / 훙 c 치온 s- 오페라와 rs - 르후 렌 세세 c 치온. HTML
    htps // p s와 db. 기주 b. 이오/도 cs/0.172/푼c 치온 s/다테치메. HTML

    지난달 이후 데이터 얻기



    date형의 컬럼에 대해서, 지난 달 이후의 데이터를 취득


    select
    base_date -- ★date型で持ってる
    from tablename
    where base_date  >= date_trunc('month', current_timestamp)- interval '1' month
    order by base_date
    limit 10;
    

    문자열 유형의 날짜 (?)에 대해 지난 달 이후의 데이터 검색


    select
    base_date_string -- ★string型で持ってる
    from tablename
    where CAST(base_date_string AS TIMESTAMP) >=  date_trunc('month', CAST(current_timestamp AS TIMESTAMP)- interval '1' month)
    order by base_date_string
    limit 10;
    

    다양한 시도한 쿼리



    문자열의 날짜를 월로 변환하고, 이달의 지난 달을 가져오고, 문자열로 되돌립니다.
    select
    base_date_string ,-- ★string型で持ってる
    date_trunc('month', CAST(base_date_string AS TIMESTAMP)) as trunc_month,
    date_trunc('month', current_timestamp) as thismonth,
    date_trunc('month', current_timestamp)- interval '1' month as lastmonth, 
    substr( cast( date_trunc('month', CAST(current_timestamp AS TIMESTAMP)- interval '1' month ) as varchar) ,1,10) as "yyyy-mm-dd-string"
    from tablename
    order by base_date_string 
    limit 10
    

    ↓결과↓



    빠진 점 (추기)



    응용적으로 "어제까지의 데이터"를 원하는 쿼리를 쓰고 있고, 몇 번 "동작 검증은 잘 가지만 아침 배치 처리를 통해 실행하면 잘 데이터를 얻을 수 없다"는 일이 일어나고 있었다.

    문득

    select current_timezone()
        _col0
    1   UTC
    



    해결



    처럼 하루 동안 검증을 한다고 판정되지만, 아침이라고 아직 UTC에서 날이 바뀌지 않았기 때문에 반드시 1일 어긋나면···.

    시간대를 지정할 수 있기 때문에

    current_timestamp AT TIME ZONE 'Asia/Tokyo'

    now() AT TIME ZONE 'Asia/Tokyo'
    하는 것으로 해결.

    좋은 웹페이지 즐겨찾기