표준 SQL의 날짜/시간 함수

BigQuery는 다음 DATETIME 함수를 지원합니다.

CURRENT_DATETIME

CURRENT_DATETIME([timezone])

설명

현재 시간을 DATETIME 객체로 반환합니다.

이 함수는 선택적 timezone 매개변수를 지원합니다. 시간대를 지정하는 방법에 대한 자세한 내용은 시간대 정의를 참조하세요.

반환 데이터 유형

DATETIME

예시

SELECT CURRENT_DATETIME() as now;

+----------------------------+
| now                        |
+----------------------------+
| 2016-05-19 10:38:47.046465 |
+----------------------------+

DATETIME

1. DATETIME(year, month, day, hour, minute, second)
2. DATETIME(date_expression, time_expression)
3. DATETIME(timestamp_expression [, timezone])

설명

  1. 연도, 월, 일, 시, 분, 초를 나타내는 INT64 값을 사용하여 DATETIME 객체를 구성합니다.
  2. DATE 및 TIME 객체를 사용하여 DATETIME 객체를 구성합니다.
  3. TIMESTAMP 객체를 사용하여 DATETIME 객체를 구성합니다. 시간대를 지정하는 선택적 매개변수를 지원합니다. 시간대를 지정하지 않으면 기본 시간대인 UTC가 사용됩니다.

반환 데이터 유형

DATETIME

예시

SELECT
  DATETIME(2008, 12, 25, 05, 30, 00) as datetime_ymdhms,
  DATETIME(TIMESTAMP "2008-12-25 05:30:00+00", "America/Los_Angeles") as datetime_tstz;

+---------------------+---------------------+
| datetime_ymdhms     | datetime_tstz       |
+---------------------+---------------------+
| 2008-12-25 05:30:00 | 2008-12-24 21:30:00 |
+---------------------+---------------------+

DATETIME_ADD

DATETIME_ADD(datetime_expression, INTERVAL INT64_expr part)

설명

INT64_exprpart 단위를 DATETIME 객체에 추가합니다.

DATETIME_ADD는 다음 part 값을 지원합니다.

  • MICROSECOND
  • MILLISECOND
  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK. 7DAY에 해당합니다.
  • MONTH
  • QUARTER
  • YEAR

월말이거나 월말과 가까운 날짜는 MONTH, QUARTER, YEAR 부분을 특수하게 처리해야 합니다. 달의 결과값이 원본 DATETIME의 일수보다 적을 경우, 일의 결과값은 새 달의 마지막 날이 됩니다.

반환 데이터 유형

DATETIME

예시

SELECT
  DATETIME "2008-12-25 15:30:00" as original_date,
  DATETIME_ADD(DATETIME "2008-12-25 15:30:00", INTERVAL 10 MINUTE) as later;

+-----------------------------+------------------------+
| original_date               | later                  |
+-----------------------------+------------------------+
| 2008-12-25 15:30:00         | 2008-12-25 15:40:00    |
+-----------------------------+------------------------+

DATETIME_SUB

DATETIME_SUB(datetime_expression, INTERVAL INT64_expr part)

설명

DATETIME에서 partINT64_expr 단위를 뺍니다.

DATETIME_SUB는 다음 part 값을 지원합니다.

  • MICROSECOND
  • MILLISECOND
  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK. 7DAY에 해당합니다.
  • MONTH
  • QUARTER
  • YEAR

월말이거나 월말과 가까운 날짜는 MONTH, QUARTER, YEAR 부분을 특수하게 처리해야 합니다. 달의 결과값이 원본 DATETIME의 일수보다 적을 경우, 일의 결과값은 새 달의 마지막 날이 됩니다.

반환 데이터 유형

DATETIME

예시

SELECT
  DATETIME "2008-12-25 15:30:00" as original_date,
  DATETIME_SUB(DATETIME "2008-12-25 15:30:00", INTERVAL 10 MINUTE) as earlier;

+-----------------------------+------------------------+
| original_date               | earlier                |
+-----------------------------+------------------------+
| 2008-12-25 15:30:00         | 2008-12-25 15:20:00    |
+-----------------------------+------------------------+

DATETIME_DIFF

DATETIME_DIFF(datetime_expression, datetime_expression, part)

설명

datetime_expression 사이에 있는 part 경계의 개수를 반환합니다. 첫 번째 DATETIME이 두 번째 DATETIME보다 먼저 올 경우, 결과는 양수가 아닌 값이 됩니다. 두 DATETIME 객체 간 마이크로초의 차이가 INT64 값을 오버플로하는 경우처럼 계산이 결과 유형을 오버플로하는 경우 오류가 발생합니다.

DATETIME_DIFF는 다음 part 값을 지원합니다.

  • MICROSECOND
  • MILLISECOND
  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK: 이 날짜 부분은 일요일에 시작됩니다.
  • WEEK(<WEEKDAY>): 이 날짜 부분은 WEEKDAY에 시작됩니다. 유효한 WEEKDAY 값은 SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY입니다.
  • ISOWEEK: ISO 8601 주 경계를 사용합니다. ISO 주는 월요일에 시작됩니다.
  • MONTH
  • QUARTER
  • YEAR
  • ISOYEAR: ISO 8601 주 번호 지정 연도 경계를 사용합니다. ISO 연도 경계는 해당 그레고리력 연도의 첫 번째 목요일이 속한 첫 번째 주의 월요일입니다.

반환 데이터 유형

INT64

예시

SELECT
  DATETIME "2010-07-07 10:20:00" as first_datetime,
  DATETIME "2008-12-25 15:30:00" as second_datetime,
  DATETIME_DIFF(DATETIME "2010-07-07 10:20:00",
    DATETIME "2008-12-25 15:30:00", DAY) as difference;

+----------------------------+------------------------+------------------------+
| first_datetime             | second_datetime        | difference             |
+----------------------------+------------------------+------------------------+
| 2010-07-07 10:20:00        | 2008-12-25 15:30:00    | 559                    |
+----------------------------+------------------------+------------------------+

SELECT
  DATETIME_DIFF(DATETIME '2017-10-15 00:00:00',
    DATETIME '2017-10-14 00:00:00', DAY) as days_diff,
  DATETIME_DIFF(DATETIME '2017-10-15 00:00:00',
    DATETIME '2017-10-14 00:00:00', WEEK) as weeks_diff;

+-----------+------------+
| days_diff | weeks_diff |
+-----------+------------+
| 1         | 1          |
+-----------+------------+

위의 예는 24시간 떨어진 두 DATETIMEDATETIME_DIFF 결과를 보여줍니다. 부분 WEEK가 있는 DATETIME_DIFF는 1을 반환합니다. DATETIME_DIFF가 이 DATETIME 범위에 있는 부분 경계의 수를 세기 때문입니다. 각각의 WEEK는 일요일에 시작하므로 2017-10-14 00:00:00 토요일과 2017-10-15 00:00:00 일요일 사이에는 하나의 부분 경계가 있습니다.

다음 예는 연도가 서로 다른 두 날짜의 DATETIME_DIFF 결과를 보여줍니다. 날짜 부분 YEAR가 있는 DATETIME_DIFF는 3을 반환합니다. 두 DATETIME 사이의 그레고리력 연도 경계의 수를 세기 때문입니다. 날짜 부분 ISOYEAR가 있는 DATETIME_DIFF는 2를 반환하는데, 두 번째 DATETIME이 ISO 2015 연도에 속하기 때문입니다. 2015 달력 연도의 첫 번째 목요일은 2015-01-01이었으므로 ISO 2015 연도는 이전 월요일인 2014-12-29에 시작합니다.

SELECT
  DATETIME_DIFF('2017-12-30 00:00:00',
    '2014-12-30 00:00:00', YEAR) AS year_diff,
  DATETIME_DIFF('2017-12-30 00:00:00',
    '2014-12-30 00:00:00', ISOYEAR) AS isoyear_diff;

+-----------+--------------+
| year_diff | isoyear_diff |
+-----------+--------------+
| 3         | 2            |
+-----------+--------------+

다음 예는 연속되는 두 날짜의 DATETIME_DIFF 결과를 보여줍니다. 첫 번째 날짜는 월요일이고 두 번째 날짜는 일요일입니다. 날짜 부분 WEEK가 있는 DATETIME_DIFF는 0을 반환합니다. 이 시간 부분은 일요일에 시작하는 주를 사용하기 때문입니다. 날짜 부분 WEEK(MONDAY)가 있는 DATETIME_DIFF는 1을 반환합니다. 날짜 부분 ISOWEEK가 있는 DATETIME_DIFF도 ISO 주가 월요일에 시작하므로 1을 반환합니다.

SELECT
  DATETIME_DIFF('2017-12-18', '2017-12-17', WEEK) AS week_diff,
  DATETIME_DIFF('2017-12-18', '2017-12-17', WEEK(MONDAY)) AS week_weekday_diff,
  DATETIME_DIFF('2017-12-18', '2017-12-17', ISOWEEK) AS isoweek_diff;

+-----------+-------------------+--------------+
| week_diff | week_weekday_diff | isoweek_diff |
+-----------+-------------------+--------------+
| 0         | 1                 | 1            |
+-----------+-------------------+--------------+

DATETIME_TRUNC

DATETIME_TRUNC(datetime_expression, part)

설명

DATETIME 객체를 part 단위로 자릅니다.

DATETIME_TRUNC는 다음 part 값을 지원합니다.

  • MICROSECOND
  • MILLISECOND
  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • WEEK(<WEEKDAY>): datetime_expression을 이전 주 경계로 자릅니다. 여기서 주는 WEEKDAY에 시작됩니다. 유효한 WEEKDAY 값은 SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY입니다.
  • ISOWEEK: datetime_expression을 이전 ISO 8601 주 경계로 자릅니다. ISOWEEK는 월요일에 시작됩니다. 각 ISO 연도의 첫 번째 ISOWEEK는 해당 그레고리력 연도의 첫 번째 목요일을 포함합니다. 이보다 이전의 모든 date_expression은 이전 월요일로 자릅니다.
  • MONTH
  • QUARTER
  • YEAR
  • ISOYEAR: datetime_expression을 이전 ISO 8601 주 번호 지정 연도 경계로 자릅니다. ISO 연도 경계는 목요일이 해당 그레고리력 연도에 속하는 첫 번째 주의 월요일입니다.

반환 데이터 유형

DATETIME

예시

SELECT
  DATETIME "2008-12-25 15:30:00" as original,
  DATETIME_TRUNC(DATETIME "2008-12-25 15:30:00", DAY) as truncated;

+----------------------------+------------------------+
| original                   | truncated              |
+----------------------------+------------------------+
| 2008-12-25 15:30:00        | 2008-12-25 00:00:00    |
+----------------------------+------------------------+

다음 예에서 원본 DATETIME은 일요일입니다. partWEEK(MONDAY)이므로 DATE_TRUNC는 이전 월요일의 DATETIME을 반환합니다.

SELECT
 datetime AS original,
 DATETIME_TRUNC(datetime, WEEK(MONDAY)) AS truncated
FROM (SELECT DATETIME(TIMESTAMP '2017-11-05 00:00:00') AS datetime);

+---------------------+---------------------+
| original            | truncated           |
+---------------------+---------------------+
| 2017-11-05 00:00:00 | 2017-10-30 00:00:00 |
+---------------------+---------------------+

다음 예에서 원본 datetime_expression은 그레고리력 2015 연도에 속합니다. 하지만 ISOYEAR 날짜 부분이 있는 DATETIME_TRUNC는 그레고리력 연도가 아니라 ISO 연도의 시작으로 datetime_expression을 자릅니다. 2015 달력 연도의 첫 번째 목요일은 2015-01-01이었으므로 ISO 2015 연도는 이전 월요일인 2014-12-29에 시작합니다. 따라서 datetime_expression 2015-06-15 00:00:00 이전의 ISO 연도 경계는 2014-12-29입니다.

SELECT
  DATETIME_TRUNC('2015-06-15 00:00:00', ISOYEAR) AS isoyear_boundary,
  EXTRACT(ISOYEAR FROM DATETIME '2015-06-15 00:00:00') AS isoyear_number;

+---------------------+----------------+
| isoyear_boundary    | isoyear_number |
+---------------------+----------------+
| 2014-12-29 00:00:00 | 2015           |
+---------------------+----------------+

FORMAT_DATETIME

FORMAT_DATETIME(format_string, datetime_expression)

설명

지정된 format_string에 따라 DATETIME 객체의 형식을 지정합니다. 이 함수가 지원하는 형식 요소 목록은 DATETIME에 지원되는 형식 요소를 참조하세요.

반환 데이터 유형

STRING

예시

SELECT
  FORMAT_DATETIME("%c", DATETIME "2008-12-25 15:30:00")
  AS formatted;

PARSE_DATETIME

PARSE_DATETIME(format_string, string)

설명

DATETIMEformat_stringSTRING 표현을 사용하여 DATETIME을 반환합니다. 이 함수가 지원하는 형식 요소의 목록은 DATETIME에 지원되는 형식 요소를 참조하세요.

PARSE_DATETIME은 다음 규칙에 따라 string을 파싱합니다.

  • 미지정 필드: 지정되지 않은 필드는 1970-01-01 00:00:00.0부터 초기화됩니다. 예를 들어 연도가 지정되지 않으면 1970이 기본값이 됩니다.
  • 대소문자를 구분하지 않는 이름: Monday, February와 같은 이름은 대소문자를 구분하지 않습니다.
  • 공백: 형식 문자열에 하나 이상의 공백이 연달아 있는 경우는 DATETIME 문자열에 0개 이상의 공백이 연달아 있는 것과 같습니다. DATETIME 문자열의 선행 및 후행 공백은 형식 문자열에 없더라도 언제나 허용됩니다.
  • 형식 우선순위: 2개 이상의 형식 요소에 겹치는 정보가 있으면 일반적으로 몇 가지 경우를 제외하고는 마지막 요소가 앞의 요소보다 우선합니다. 예를 들어 %F%Y는 모두 연도에 영향을 주므로 이전 요소가 이후 요소보다 우선합니다. DATETIME에 지원되는 형식 요소에서 %s, %C, %y에 대한 설명을 참조하세요.

예시

다음 예에서는 STRING 리터럴을 DATETIME으로 파싱합니다.

SELECT PARSE_DATETIME('%Y-%m-%d %H:%M:%S', '1998-10-18 13:45:55') AS datetime;

위의 쿼리는 다음과 같은 출력을 반환합니다.

+---------------------+
| datetime            |
+---------------------+
| 1998-10-18 13:45:55 |
+---------------------+

다음 예에서는 자연어 형식의 날짜를 포함하는 STRING 리터럴을 DATETIME으로 파싱합니다.

SELECT PARSE_DATETIME('%A, %B %e, %Y','Wednesday, December 19, 2018')
  AS datetime;

위의 쿼리는 다음과 같은 출력을 반환합니다.

+---------------------+
| datetime            |
+---------------------+
| 2018-12-19 00:00:00 |
+---------------------+

반환 데이터 유형

DATETIME

DATETIME에 지원되는 형식 요소

달리 명시되지 않는 한, 형식 문자열을 사용하는 DATETIME 함수는 다음 요소를 지원합니다.

형식 요소 설명
%A 요일 이름입니다.
%a 요일 이름의 약어입니다.
%B 월 이름입니다.
%b 또는 %h 월 이름의 약어입니다.
%C 10진수(00~99)로 표현한 세기(연도를 100으로 나누어 정수로 자른 것)입니다.
%c 날짜 및 시간 표현입니다.
%D %m/%d/%y 형식으로 표현한 날짜입니다.
%d 한 달의 일을 10진수(01~31)로 표현한 것입니다.
%e 한 달의 일을 10진수(1~31)로 표현한 것입니다. 한 자릿수 앞에는 공백이 옵니다.
%F %Y-%m-%d 형식으로 표현한 날짜입니다.
%G ISO 8601 연도를 세기와 함께 10진수로 표현한 것입니다. 각 ISO 연도는 태양력 연도의 첫 번째 목요일 전 월요일에 시작됩니다. 태양력 연도와 ISO 연도가 달라질 수 있는 태양력 연도 경계 근처에서 %G와 %Y가 서로 다른 결과를 생성할 수 있습니다.
%g ISO 8601 연도를 세기 없이 10진수(00~99)로 표현한 것입니다. 각 ISO 연도는 태양력 연도의 첫 번째 목요일 전 월요일에 시작됩니다. 태양력 연도와 ISO 연도가 달라질 수 있는 태양력 연도 경계 근처에서 %g와 %y가 서로 다른 결과를 생성할 수 있습니다.
%H 시간(24시간제)을 10진수(00~23)로 표현한 것입니다.
%I 시간(12시간제)을 10진수(01~12)로 표현한 것입니다.
%j 연중 일을 10진수(001~366)로 표현한 것입니다.
%k 시간(24시간제)을 10진수(0~23)로 표현한 것입니다. 한 자릿수 앞에는 공백이 옵니다.
%l 시간(12시간제)을 10진수(1~12)로 표현한 것입니다. 한 자릿수 앞에는 공백이 옵니다.
%M 분을 10진수(00~59)로 표현한 것입니다.
%m 월을 10진수(01~12)로 표현한 것입니다.
%n 줄바꿈 문자입니다.
%P am 또는 pm입니다.
%p AM 또는 PM입니다.
%R %H:%M 형식으로 표현한 시간입니다.
%r AM/PM 표기법을 사용한 12시간제 시간입니다.
%S 초를 10진수(00~60)로 표현한 것입니다.
%s 1970-01-01 00:00:00 이후의 초 수입니다. 문자열에서 %s가 나타나는 위치에 상관없이 항상 다른 모든 형식 요소보다 우선합니다. 여러 개의 %s 요소가 나타날 경우, 마지막 요소가 우선합니다.
%T %H:%M:%S 형식으로 표현한 시간입니다.
%t 탭 문자입니다.
%U 한 해의 주 번호(일요일이 일주일의 첫 번째 날임)를 10진수(00-53)로 표현한 것입니다.
%u 요일(월요일이 일주일의 첫 번째 날임)을 10진수(1~7)로 표현한 것입니다.
%V 한 해의 주 번호(월요일이 일주일의 첫 번째 날임)를 10진수(01~53)로 표현한 것입니다. 새해에 1월 1일이 포함된 주의 일수가 4일 이상인 경우, 그 주가 첫 번째 주이고, 그렇지 않은 경우에는 그 주가 이전 연도의 53번째 주이고 그다음 주가 첫 번째 주입니다.
%W 한 해의 주 번호(월요일이 일주일의 첫 번째 날임)를 10진수(00-53)로 표현한 것입니다.
%w 요일(일요일이 일주일의 첫 번째 날임)을 10진수(0~6)로 표현한 것입니다.
%X 시간을 HH:MM:SS 형식으로 표현한 것입니다.
%x 날짜를 MM/DD/YY 형식으로 표현한 것입니다.
%Y 연도를 세기와 함께 10진수로 표현한 것입니다.
%y 연도를 세기 없이 10진수(00~99)로 표현한 것입니다. 앞의 0 표기 여부는 선택할 수 있습니다. %C와 함께 사용할 수 있습니다. %C를 지정하지 않으면 00-68년은 2000년대이고 69-99년은 1900년대입니다.
%% 단일 % 문자입니다.
%E#S 초를 #자리 소수의 정밀도로 표현한 것입니다.
%E*S 초를 전체 소수 자릿수로 표현한 것입니다(리터럴 '*').
%E4Y 4자릿수 연도(0001 ... 9999). %Y는 연도를 완전히 렌더링하는 데 필요한 만큼 문자 수를 생성한다는 점에 유의하세요.
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.