(SQL) 빅쿼리 날짜 함수
(SQL) 빅쿼리 날짜 함수
날짜 함수란 날짜 타입 ( DATE, DATETIME ,TIMESTAMP…) 의 데이터를 다룰때 사용하는 함수이다.
날짜의 출력 형식을 지정하거나 날짜를 계산할 때 사용한다.
- Case 1 ) 날짜 출력 형식 :
- YYYY-MM-DD 형식으로 값이 입력되어 있는 날짜 필드를 YYYYMMDD 형식으로 바꾸고 싶다.
- ( ex. 2024-08-02 -> 20240802 )
- YYYY-MM-DD 형식으로 값이 입력되어 있는 날짜 필드를 YYYYMMDD 형식으로 바꾸고 싶다.
- Case 2 ) 날짜 계산 :
- 현재 날짜 기준, n일전 데이터에서 전일자 데이터까지 조회하고 싶다.
- ( ex. 2024년 8월 28일 기준 , 35일전인 데이터에서 전일자 데이터까지 조회하고 싶다 )
- 현재 날짜 기준, n일전 데이터에서 전일자 데이터까지 조회하고 싶다.
날짜 출력 형식을 지정할때는 어떤 함수를 쓰는지, 날짜를 계산할때는 어떤 함수를 쓰는지 아래에서 알아보자.
앞서 소개했듯이, 날짜 함수는 크게 두가지로 분류할 수 있다.
( 내가 만든 분류이다. 공식적인 분류는 아니다. )
- 출력 형식 지정 함수: 데이터 타입이나 출력 형태를 지정하는 함수
- 대표 함수 : FORMAT_DATE , PARSE_DATE , DATE_TRUNC , EXTRACT
- 대표 함수 : FORMAT_DATE , PARSE_DATE , DATE_TRUNC , EXTRACT
- 계산 함수 : 날짜를 계산하는 함수
- 대표 함수 : DATE_ADD , DATE_SUB , DATE_DIFF
- 대표 함수 : DATE_ADD , DATE_SUB , DATE_DIFF
각 대표 함수에 대한 설명은 아래 표에서 살펴 보자.
1) 출력 형식 지정 함수
| 함수명 | 정의 | 문법 |
|---|---|---|
| FORMAT_DATE | date의 날짜값을 지정된 형식의 string값으로 출력한다 | FORMAT_DATE ( ‘출력하고자 하는 형식’ , 날짜 필드 ) |
| PARSE_DATE | string 타입으로 된 날짜값을 date 타입으로 출력한다 | PARSE_DATE ( ‘입력된 형식’ , 날짜 필드 ) |
| DATE_TRUNC | 날짜값을 지정된 범위까지 잘라낸다.지정된 범위 아래의 값은 내림 처림한다 | DATE_TRUNC(날짜 필드 , 날짜 부분 ) |
| EXTRACT | 날짜값중 지정한 부분 (ex.월)을 뽑아낸다. | EXTRACT ( 날짜 부분 from 날짜 필드 ) |
2) 계산 함수
| 함수명 | 정의 | 문법 |
|---|---|---|
| DATE_ADD | 지정한 간격만큼 날짜를 더한다. | DATE_ADD ( 날짜 필드 , interval n Day ) |
| DATE_SUB | 지정한 간격만큼 날짜를 뺀다. | DATE_SUB ( 날짜 필드, interval n Day ) |
| DATE_DIFF | 두 날짜 끼리 빼준다. 두 날짜 사이의 간격을 구할 수 있다. | DATE_DIFF ( 날짜 필드 1 , 날짜 필드 2 , 날짜 부분 ) |
특히 출력 형식 지정함수에서 FORMAT_DATE과 PARSE_DATE을 헷갈려하는 경우가 많다.
( ex. 20240825 -> 2024-08-25 )
둘은 서로 역의 관계라고 생각하면 된다.
FORMAT_DATE은 date를 string으로, PARSE_DATE은 string을 date로 바꿔서 출력한다.
특히 PARSE_DATE은 날짜를 나타내는, ‘%Y-%m-%d 형식이 아닌 string값을 날짜 타입으로 변경할때 유용하다.
( ex. 20240825 -> 2024-08-25 )
DATE( ) 사용해서 날짜 타입으로 변경 많이 하는데 %Y-%m-%d 형식이 아닌 string 값은 DATE( ) 함수 사용시 에러가 난다.
이 경우 PARSE_DATE( ) 를 사용해야한다. substr과 concat함수를 이용해서 조합하는 방법도 있지만
구문이 길어지기 때문에 PARSE_DATE( ) 을 사용하는 것을 권장한다.
DB를 일별로 수집한다고 했을때 테이블의 _table_suffix가 ‘%Y%m%d’ 형식으로 되어있는 경우가 많다.
불러온 _table_suffix를 그대로 날짜 필드로 넣고 싶을때 PARSE_DATE를 쓰면 된다.
( 예시: PARSE_DATE(‘%Y%m%d’,_table_suffix) AS yyyymmdd )
1) 다루고자 하는 날짜 타입 (Date, Datetime ,Timestamp )에 따라 함수명을 변경할 수 있다.
위에서 소개한 함수들은 DATE 타입을 기준으로 함수명을 써놓았는데 예시처럼 다 변경이 가능하다
ㄴ ex) FORMAT_DATE -> FORMAT_DATETIME , FORMAT_TIMESTAMP
ㄴ ex) DATE_ADD -> DATETIME_ADD , TIMESTAMP_ADD
참고로 DATE와 DATETIME, TIMESTAMP는 표현할 수 있는 날짜 범위에 차이가 있다.
- DATE : 날짜를 년, 월 , 일 까지 저장하고 있는 날짜 타입
- DATETIME : 날짜를 년 , 월 , 일 , 시 , 분 , 초 ,초 미만으로 저장하고 있는 날짜 타입
- TIMESTAMP : 날짜를 마이크로초단위 ( 초 이하 소숫점 6자리 ) 로 정밀하게 저장하고 있는 날짜 타입
TIMESTAMP는 빅쿼리상에서는 타임존이 같이 출력된다. ( ex: 2024-01-01 12:30:12.000000 UTC )
빅쿼리 자체적으로는 마이크로초로 날짜값을 저장하고있는데 ( 고정된 초기 시점 이후 경과된 마이크로초 수 )
표기시에 변환해서 출력해주면서 타임존까지 같이 나타내주는것이다.
DATETIME과의 차이는 타임존을 포함하고 있다 정도로 보면 될것같다.
2) 날짜 출력 형식은 아래 표현을 참고하면 된다.
| 표현 | 설명 |
|---|---|
| %Y | 년도를 십진수로 표현 |
| %m | 월을 십진수로 표현 |
| %d | 일을 십진수로 표현 |
| %H | 시간을 십진수로 표현 |
| %M | 분을 십진수로 표현 |
| %S | 초를 십진수로 표현 |
| %F | %Y-%m-%d |
| %T | %H:%M:%S |