표준 SQL의 날짜 함수

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

CURRENT_DATE

CURRENT_DATE([time_zone])

설명

지정된 시간대 또는 기본 시간대를 기준으로 현재 날짜를 반환합니다.

이 함수는 선택적 time_zone 매개변수를 지원합니다. 이 매개변수는 사용할 시간대를 나타내는 문자열입니다. 시간대를 지정하지 않으면 기본 시간대인 UTC가 사용됩니다. 시간대를 지정하는 방법에 대한 자세한 내용은 시간대 정의를 참조하세요.

time_zone 매개변수가 NULL로 평가되면 이 함수는 NULL을 반환합니다.

반환 데이터 유형

DATE

SELECT CURRENT_DATE() as the_date;

+--------------+
| the_date     |
+--------------+
| 2016-12-25   |
+--------------+

EXTRACT

EXTRACT(part FROM date_expression)

설명

지정된 날짜 부분(part)에 해당하는 값을 반환합니다. part는 다음 중 하나여야 합니다.

  • DAYOFWEEK: 한 주의 첫 날이 일요일인 [1,7] 범위의 값을 반환합니다.
  • DAY
  • DAYOFYEAR
  • WEEK: [0, 53] 범위에서 해당 날짜의 주 번호를 반환합니다. 주는 일요일부터 시작되며 그 해의 첫 번째 일요일 이전 날짜는 0번째 주에 속합니다.

  • WEEK(<WEEKDAY>): [0, 53] 범위에서 해당 날짜의 주 번호를 반환합니다. 주는 WEEKDAY부터 시작되며 그 해의 첫 번째 WEEKDAY 이전 날짜는 0번째 주에 속합니다. 유효한 WEEKDAY 값은 SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY입니다.

  • ISOWEEK: date_expressionISO 8601 주 번호를 반환합니다. ISOWEEK는 월요일에 시작됩니다. 반환 값은 [1, 53] 범위에 속합니다. 각 ISO 해의 첫 번째 ISOWEEK는 그레고리력의 첫 번째 목요일 이전의 월요일에 시작됩니다.
  • MONTH
  • QUARTER: [1,4] 범위의 값을 반환합니다.
  • YEAR
  • ISOYEAR: date_expression이 속한 주의 목요일을 포함하는 그레고리력인 ISO 8601 주 번호 지정 연도를 반환합니다.

반환 데이터 유형

INT64

다음 예에서 EXTRACTDAY 시간 부분에 해당하는 값을 반환합니다.

SELECT EXTRACT(DAY FROM DATE '2013-12-25') as the_day;

+---------+
| the_day |
+---------+
| 25      |
+---------+

다음 예에서 EXTRACT는 연말에 가까운 날짜 열에서 다른 시간 부분에 해당하는 값을 반환합니다.

SELECT
  date,
  EXTRACT(ISOYEAR FROM date) AS isoyear,
  EXTRACT(ISOWEEK FROM date) AS isoweek,
  EXTRACT(YEAR FROM date) AS year,
  EXTRACT(WEEK FROM date) AS week
FROM UNNEST(GENERATE_DATE_ARRAY('2015-12-23', '2016-01-09')) AS date
ORDER BY date;
+------------+---------+---------+------+------+
| date       | isoyear | isoweek | year | week |
+------------+---------+---------+------+------+
| 2015-12-23 | 2015    | 52      | 2015 | 51   |
| 2015-12-24 | 2015    | 52      | 2015 | 51   |
| 2015-12-25 | 2015    | 52      | 2015 | 51   |
| 2015-12-26 | 2015    | 52      | 2015 | 51   |
| 2015-12-27 | 2015    | 52      | 2015 | 52   |
| 2015-12-28 | 2015    | 53      | 2015 | 52   |
| 2015-12-29 | 2015    | 53      | 2015 | 52   |
| 2015-12-30 | 2015    | 53      | 2015 | 52   |
| 2015-12-31 | 2015    | 53      | 2015 | 52   |
| 2016-01-01 | 2015    | 53      | 2016 | 0    |
| 2016-01-02 | 2015    | 53      | 2016 | 0    |
| 2016-01-03 | 2015    | 53      | 2016 | 1    |
| 2016-01-04 | 2016    | 1       | 2016 | 1    |
| 2016-01-05 | 2016    | 1       | 2016 | 1    |
| 2016-01-06 | 2016    | 1       | 2016 | 1    |
| 2016-01-07 | 2016    | 1       | 2016 | 1    |
| 2016-01-08 | 2016    | 1       | 2016 | 1    |
| 2016-01-09 | 2016    | 1       | 2016 | 1    |
+------------+---------+---------+------+------+

다음 예에서 date_expression은 일요일입니다. EXTRACT는 일요일에 시작하는 주를 사용하여 첫 번째 열을 계산하고, 월요일에 시작하는 주를 사용하여 두 번째 열을 계산합니다.

WITH table AS (SELECT DATE('2017-11-05') AS date)
SELECT
  date,
  EXTRACT(WEEK(SUNDAY) FROM date) AS week_sunday,
  EXTRACT(WEEK(MONDAY) FROM date) AS week_monday FROM table;

+------------+-------------+-------------+
| date       | week_sunday | week_monday |
+------------+-------------+-------------+
| 2017-11-05 | 45          | 44          |
+------------+-------------+-------------+

DATE

1. DATE(year, month, day)
2. DATE(timestamp_expression[, timezone])

설명

  1. INT64 값에서 연도, 월, 일을 나타내는 DATE를 구성합니다.
  2. timestamp_expression을 DATE 데이터 유형으로 변환합니다. 시간대를 지정하는 선택적 매개변수를 지원합니다. 시간대를 지정하지 않으면 기본 시간대인 UTC가 사용됩니다.

반환 데이터 유형

DATE

SELECT
  DATE(2016, 12, 25) as date_ymd,
  DATE(TIMESTAMP "2016-12-25 05:30:00+07", "America/Los_Angeles") as date_tstz;

+------------+------------+
| date_ymd   | date_tstz  |
+------------+------------+
| 2016-12-25 | 2016-12-24 |
+------------+------------+

DATE_ADD

DATE_ADD(date_expression, INTERVAL INT64_expr date_part)

설명

DATE에 지정된 시간 간격을 추가합니다.

DATE_ADD는 다음과 같은 date_part 값을 지원합니다.

  • DAY
  • WEEK. 7DAY에 해당합니다.
  • MONTH
  • QUARTER
  • YEAR

월말이거나 월말과 가까운 날짜는 MONTH, QUARTER, YEAR 부분에 특별한 처리가 필요합니다. 달의 결과값이 원래 날짜의 일수보다 적을 경우, 일의 결과값은 새 달의 마지막 날입니다.

반환 데이터 유형

DATE

SELECT DATE_ADD(DATE "2008-12-25", INTERVAL 5 DAY) as five_days_later;

+--------------------+
| five_days_later    |
+--------------------+
| 2008-12-30         |
+--------------------+

DATE_SUB

DATE_SUB(date_expression, INTERVAL INT64_expr date_part)

설명

DATE에서 지정된 시간 간격을 뺍니다.

DATE_SUB는 다음과 같은 date_part 값을 지원합니다.

  • DAY
  • WEEK. 7DAY에 해당합니다.
  • MONTH
  • QUARTER
  • YEAR

월말이거나 월말과 가까운 날짜는 MONTH, QUARTER, YEAR 부분에 특별한 처리가 필요합니다. 달의 결과값이 원래 날짜의 일수보다 적을 경우, 일의 결과값은 새 달의 마지막 날입니다.

반환 데이터 유형

DATE

SELECT DATE_SUB(DATE "2008-12-25", INTERVAL 5 DAY) as five_days_ago;

+---------------+
| five_days_ago |
+---------------+
| 2008-12-20    |
+---------------+

DATE_DIFF

DATE_DIFF(date_expression, date_expression, date_part)

설명

date_expression 사이에 있는 date_part 경계의 개수를 반환합니다. 첫 번째 날짜가 두 번째 날짜보다 먼저 올 경우, 결과는 양수가 아닌 값이 됩니다.

DATE_DIFF는 다음 date_part 값을 지원합니다.

  • 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 DATE_DIFF(DATE '2010-07-07', DATE '2008-12-25', DAY) as days_diff;

+-----------+
| days_diff |
+-----------+
| 559       |
+-----------+

SELECT
  DATE_DIFF(DATE '2017-10-15', DATE '2017-10-14', DAY) as days_diff,
  DATE_DIFF(DATE '2017-10-15', DATE '2017-10-14', WEEK) as weeks_diff;

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

위의 예는 연속되는 두 날짜의 DATE_DIFF 결과를 보여줍니다. 날짜 부분 WEEK가 있는 DATE_DIFF는 1을 반환하는데, DATE_DIFF가 이 날짜 범위에 있는 날짜 부분 경계의 수를 세기 때문입니다. 각각의 WEEK는 일요일에 시작하므로 2017-10-14 토요일과 2017-10-15 일요일 사이에는 하나의 날짜 부분 경계가 있습니다.

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

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

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

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

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

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

DATE_TRUNC

DATE_TRUNC(date_expression, date_part)

설명

날짜를 지정한 단위로 자릅니다.

DATE_TRUNCdate_part에 다음 값을 지원합니다.

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

반환 데이터 유형

DATE

SELECT DATE_TRUNC(DATE '2008-12-25', MONTH) as month;

+------------+
| month      |
+------------+
| 2008-12-01 |
+------------+

다음 예에서 원본 날짜는 일요일입니다. date_partWEEK(MONDAY)이므로 DATE_TRUNC는 이전 월요일의 DATE를 반환합니다.

SELECT date AS original, DATE_TRUNC(date, WEEK(MONDAY)) AS truncated
FROM (SELECT DATE('2017-11-05') AS date);

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

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

SELECT
  DATE_TRUNC('2015-06-15', ISOYEAR) AS isoyear_boundary,
  EXTRACT(ISOYEAR FROM DATE '2015-06-15') AS isoyear_number;

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

DATE_FROM_UNIX_DATE

DATE_FROM_UNIX_DATE(INT64_expression)

설명

INT64_expression을 1970-01-01 이후의 일수로 해석합니다.

반환 데이터 유형

DATE

SELECT DATE_FROM_UNIX_DATE(14238) as date_from_epoch;

+-----------------+
| date_from_epoch |
+-----------------+
| 2008-12-25      |
+-----------------+

FORMAT_DATE

FORMAT_DATE(format_string, date_expr)

설명

지정된 format_string에 따라 date_expr의 형식을 지정합니다.

이 함수가 지원하는 형식 요소 목록은 DATE에 지원되는 형식 요소를 참조하세요.

반환 데이터 유형

STRING

SELECT FORMAT_DATE("%x", DATE "2008-12-25") as US_format;

+------------+
| US_format  |
+------------+
| 12/25/08   |
+------------+

PARSE_DATE

PARSE_DATE(format_string, date_string)

설명

format_string과 날짜의 문자열 표현을 사용하여 DATE 객체를 반환합니다.

PARSE_DATE를 사용할 때는 다음 사항에 유의하세요.

  • 미지정 필드. 지정하지 않은 필드는 1970-01-01에서 초기화됩니다.
  • 대소문자를 구분하지 않는 이름. Monday, February 등과 같은 이름은 대소문자를 구분하지 않습니다.
  • 공백. 형식 문자열에 하나 이상의 공백이 연달아 있는 경우는 날짜 문자열에 0개 이상의 공백이 연달아 있는 것에 해당합니다. 또한 날짜 문자열의 선행 및 후행 공백은 형식 문자열에 없더라도 언제나 허용됩니다.
  • 형식 우선순위. 2개(또는 그 이상)의 형식 요소에 중첩되는 정보가 있을 경우(예: %F%Y가 모두 연도에 적용되는 경우), 일반적으로 마지막 요소가 앞의 요소보다 우선합니다.

이 함수가 지원하는 형식 요소 목록은 DATE에 지원되는 형식 요소를 참조하세요.

반환 데이터 유형

DATE

SELECT PARSE_DATE("%x", "12/25/08") as parsed;

+------------+
| parsed     |
+------------+
| 2008-12-25 |
+------------+

UNIX_DATE

UNIX_DATE(date_expression)

설명

1970-01-01 이후의 일수를 반환합니다.

반환 데이터 유형

INT64

SELECT UNIX_DATE(DATE "2008-12-25") as days_from_epoch;

+-----------------+
| days_from_epoch |
+-----------------+
| 14238           |
+-----------------+

DATE에 지원되는 형식 요소

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

형식 요소 설명
%A 요일 이름입니다.
%a 요일 이름의 약어입니다.
%B 월 이름입니다.
%b 또는 %h 월 이름의 약어입니다.
%C 10진수(00-99)로 표현한 세기(연도를 100으로 나누어 정수로 자른 것)입니다.
%D %m/%d/%y 형식으로 표현한 날짜입니다.
%d 한 달의 일을 10진수(01-31)로 표현한 것입니다.
%e 한 달의 일을 10진수(1-31)로 표현한 것입니다. 한 자릿수 앞에는 공백이 옵니다.
%F %Y-%m-%d 형식으로 표현한 날짜입니다.
%G ISO 8601 연도를 세기와 함께 10진수로 표현한 것입니다.
%g ISO 8601 연도를 세기 없이 10진수(00-99)로 표현한 것입니다.
%j 한 해의 일을 10진수(001-366)로 표현한 것입니다.
%m 월을 10진수(01-12)로 표현한 것입니다.
%n 줄바꿈 문자입니다.
%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 날짜를 MM/DD/YY 형식으로 표현한 것입니다.
%Y 연도를 세기와 함께 10진수로 표현한 것입니다.
%y 연도를 세기 없이 10진수(00-99)로 표현한 것입니다. 앞의 0 표기 여부는 선택할 수 있습니다. %C와 함께 사용할 수 있습니다. %C를 지정하지 않으면, 00-68년은 2000년대이고 69-99년은 1900년대입니다.
%E4Y 4자릿수 연도(0001 ... 9999)입니다. %Y는 연도를 완전히 렌더링하는 데 필요한 만큼 문자 수를 생성한다는 점에 유의하세요.
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

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

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