SnowConvert AI - BigQuery - 데이터 타입

Snowflake는 열, 로컬 변수, 식, 매개변수 등 다양한 SQL 구조에 걸쳐 특정 제한 사항을 포함하여 대부분의 기본 SQL 데이터 타입을 지원합니다.

부울 데이터 타입

BigQuery

Snowflake

참고

BOOL/BOOLEAN

BOOLEAN

바이트 데이터 타입

BigQuery

Snowflake

참고

BYTES

BINARY

BYTES 데이터 타입은 Snowflake에서 지원되지 않습니다. BINARY가 대신 사용됩니다. 자세한 내용은 BYTES 데이터 타입 설명서를 참조하세요.

날짜/시간 데이터 타입

BigQuery

Snowflake

참고

DATE

DATE

DATETIME

DATETIME

DATETIME은 Snowflake에서 TIMESTAMP_NTZ의 별칭입니다.

TIMESTAMP

TIMESTAMP_TZ

TIMESTAMP 데이터 타입은 TIMESTAMP_TZ로 변환됩니다. 자세한 내용은 TIMESTAMP 데이터 타입 설명서를 참조하세요.

TIME

TIME

지리 데이터 타입

BigQuery

Snowflake

참고

GEOGRAPHY

GEOGRAPHY

간격 데이터 타입

BigQuery

Snowflake

참고

INTERVAL

VARCHAR(30)

INTERVAL 데이터 타입은 Snowflake에서 지원되지 않습니다. 대신 VARCHAR가 사용됩니다. 자세한 내용은 INTERVAL 데이터 타입 설명서를 참조하세요.

Json 데이터 타입

BigQuery

Snowflake

참고

JSON

VARIANT

JSON 데이터 타입은 Snowflake에서 지원되지 않습니다. 대신 VARIANT가 사용됩니다. 자세한 내용은 JSON 데이터 타입 설명서를 참조하세요.

숫자 데이터 타입

BigQuery

Snowflake

참고

INT64

INT

INT는 Snowflake에서 NUMBER 데이터 타입의 별칭입니다. 최대 전체 자릿수와 소수 자릿수는 NUMBER(38,37)입니다.

INT

INT

INT는 Snowflake에서 NUMBER 데이터 타입의 별칭입니다. 최대 전체 자릿수와 소수 자릿수는 NUMBER(38,37)입니다.

SMALLINT

SMALLINT

SMALLINT는 Snowflake에서 NUMBER 데이터 타입의 별칭입니다. 최대 전체 자릿수와 소수 자릿수는 NUMBER(38,37)입니다.

INTEGER

INTEGER

INTEGER는 Snowflake에서 NUMBER 데이터 타입의 별칭입니다. 최대 전체 자릿수와 소수 자릿수는 NUMBER(38,37)입니다.

BIGINT

BIGINT

BIGINT는 Snowflake에서 NUMBER 데이터 타입의 별칭입니다. 최대 전체 자릿수와 소수 자릿수는 NUMBER(38,37)입니다.

TINYINT

TINYINT

TINYINT는 Snowflake에서 NUMBER 데이터 타입의 별칭입니다. 최대 전체 자릿수와 소수 자릿수는 NUMBER(38,37)입니다.

BYTEINT

BYTEINT

BYTEINT는 Snowflake에서 NUMBER 데이터 타입의 별칭입니다. 최대 전체 자릿수와 소수 자릿수는 NUMBER(38,37)입니다.

NUMERIC

NUMERIC

NUMERIC는 Snowflake에서 NUMBER 데이터 타입의 별칭입니다. 최대 전체 자릿수와 소수 자릿수는 NUMBER(38,37)입니다.

DECIMAL

DECIMAL

DECIMAL는 Snowflake에서 NUMBER 데이터 타입의 별칭입니다. 최대 전체 자릿수와 소수 자릿수는 NUMBER(38,37)입니다.

BIGNUMERIC

NUMERIC

Snowflake는 BIGNUMERIC 데이터 타입을 지원하지 않습니다. 대신 NUMERIC을 사용합니다. BIGNUMERIC의 전체 자릿수 76,76이 Snowflake의 제한(38)을 초과하여 잘림 또는 반올림이 발생해 상당한 부정확성을 유발할 수 있습니다.

BIGDECIMAL

DECIMAL

Snowflake는 BIGDECIMAL 데이터 타입을 지원하지 않습니다. 대신 NUMERIC을 사용합니다. BIGDECIMAL의 전체 자릿수 76,76이 Snowflake의 제한(38)을 초과하여 잘림 또는 반올림이 발생해 상당한 부정확성을 유발할 수 있습니다.

FLOAT64

FLOAT

문자열 데이터 타입

BigQuery

Snowflake

참고

STRING

STRING

STRING은 Snowflake에서 VARCHAR 데이터 타입의 별칭입니다. VARCHAR은 유니코드 UTF-8 문자를 보유합니다.

ANY TYPE

BigQuery의 ANY TYPE 데이터 타입에 대한 변환 사양

설명

다음은 CREATE FUNCTION 문 내에서 ANY TYPE 사용에 대한 정보를 발췌한 것입니다.

함수가 호출될 때 ANY TYPE과 같은 유형의 매개 변수는 둘 이상의 인자 유형과 일치할 수 있습니다.

  • 둘 이상의 매개 변수에 ANYTYPE 유형이 있는 경우 BigQuery는 이러한 인자 사이에 형식 관계를 적용하지 않습니다.

  • 함수 반환 유형은 ANY TYPE일 수 없습니다. 생략하거나 sql_expression 또는 명시적 형식에 따라 자동으로 결정되어야 합니다.

  • 함수 정의와 호환되지 않는 형식의 함수 인자를 전달하면 호출 시 오류가 발생합니다.

샘플 소스 패턴

UDFs에 대한 형식 정의

ANY TYPE은 함수의 매개 변수에 대한 유형으로만 찾을 수 있습니다. SnowConvert AI는 자동으로 ANY TYPEVARIANT로 변환합니다.

BigQuery
CREATE FUNCTION addFourAndDivideAny(x ANY TYPE, y ANY TYPE)
AS (
  (x + 4) / y
);
Copy
Snowflake
CREATE FUNCTION addFourAndDivideAny (x VARIANT, y VARIANT)
RETURNS VARIANT
AS
$$
  ((x + 4) / y) :: VARIANT
$$;
Copy

ARRAY<T>

ARRAY를 BigQuery에서 Snowflake로 변환하기 위한 변환 사양

설명

BigQuery에서 배열은 배열이 아닌 값들로 이루어진 요소를 0개 이상 순서대로 나열한 목록을 말합니다. 배열의 요소는 동일한 유형을 공유해야 합니다.(배열 유형. BigQuery)

샘플 소스 패턴

BigQuery

CREATE TABLE test.arrayTable
(
  col1 ARRAY<INT64>
);

CREATE TABLE test.anotherArrayTable
(
  col2 ARRAY<INT64>
);

INSERT INTO test.arrayTable VALUES ([4, 10, 55]);
INSERT INTO test.arrayTable VALUES ([6, 7, 33]);
INSERT INTO test.arrayTable VALUES ([50, 12, 22]);

INSERT INTO test.anotherArrayTable VALUES ([9, 11, 52]);
INSERT INTO test.anotherArrayTable VALUES ([3, 18, 11]);
INSERT INTO test.anotherArrayTable VALUES ([33, 27, 43]);
Copy

Snowflake

CREATE TABLE test.arrayTable
(
  col1 ARRAY DEFAULT []
);

CREATE TABLE test.anotherArrayTable
(
  col2 ARRAY DEFAULT []
);

INSERT INTO test.arrayTable SELECT [4, 10, 55];
INSERT INTO test.arrayTable SELECT [6, 7, 33];
INSERT INTO test.arrayTable SELECT [50, 12, 22];

INSERT INTO test.anotherArrayTable SELECT [9, 11, 52];
INSERT INTO test.anotherArrayTable SELECT [3, 18, 11];
INSERT INTO test.anotherArrayTable SELECT [33, 27, 43];
Copy

인덱스를 통한 ARRAY 액세스

BigQuery
SELECT
col1[0] + 4 AS byIndex,
col1[OFFSET(0)] + 4 AS byOffset,
col1[ORDINAL(1)] + 4 AS byOrdinal
FROM test.arrayTable ORDER BY col1[0];
Copy
Snowflake
SELECT
--** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
col1[0] + 4 AS byIndex,
--** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
col1[0] + 4 AS byOffset,
--** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
col1[1 - 1] + 4 AS byOrdinal
FROM
test.arrayTable
ORDER BY
--** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
col1[0];
Copy

인덱스를 통한 안전한 ARRAY 액세스

BigQuery
SELECT
col1[SAFE_OFFSET(0)] AS byOffsset,
col1[SAFE_OFFSET(-4)] AS byOffsetUnderflow,
col1[SAFE_OFFSET(500)] AS byOffsetOverflow,
col1[SAFE_ORDINAL(1)] AS byOrdinal,
col1[SAFE_ORDINAL(-4)] AS byOrdinalUnderflow,
col1[SAFE_ORDINAL(500)] AS byOrdinalOverflow
FROM test.arrayTable ORDER BY col1[0];
Copy
Snowflake
SELECT
PUBLIC.SAFE_OFFSET_UDF(col1, 0) AS byOffsset,
PUBLIC.SAFE_OFFSET_UDF(col1, -4) AS byOffsetUnderflow,
PUBLIC.SAFE_OFFSET_UDF(col1, 500) AS byOffsetOverflow,
PUBLIC.SAFE_OFFSET_UDF(col1, 1 - 1) AS byOrdinal,
PUBLIC.SAFE_OFFSET_UDF(col1, -4 - 1) AS byOrdinalUnderflow,
PUBLIC.SAFE_OFFSET_UDF(col1, 500 - 1) AS byOrdinalOverflow
FROM test.arrayTable ORDER BY 
--** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
col1[0];
Copy

VALUES 절에 ARRAY가 있는 INSERT

BigQuery
INSERT INTO test.arrayTable VALUES ([4, 10]);

INSERT INTO test.arrayTable (COL1)
VALUES ([1, 2, 3]), ([4, 5, 6]);

SELECT col1 FROM test.arrayTable ORDER BY col1[0], col1[1];
Copy
Snowflake
INSERT INTO test.arrayTable SELECT [4, 10];

INSERT INTO test.arrayTable (COL1)
SELECT [1, 2, 3] 
UNION ALL
SELECT [4, 5, 6];

SELECT col1 FROM
  test.arrayTable
ORDER BY
  --** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
  col1[0],
  --** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
  col1[1];
Copy

MERGE 문

BigQuery
MERGE INTO test.anotherArrayTable
USING test.arrayTable
ON col1[0] = col2[0]
WHEN MATCHED THEN UPDATE SET col2 = col1
WHEN NOT MATCHED THEN INSERT VALUES ([100, 100, 100]);

SELECT col2 FROM test.anotherArrayTable ORDER BY col2[0];
Copy
Snowflake
MERGE INTO test.anotherArrayTable
USING test.arrayTable
ON col1[0] = col2[0]
WHEN MATCHED THEN UPDATE SET col2 = col1
WHEN NOT MATCHED THEN INSERT VALUES ([100, 100, 100]) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'MergeStatement' NODE ***/!!!;

SELECT col2 FROM
  test.anotherArrayTable
ORDER BY
  --** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
  col2[0];
Copy

ARRAY DEFAULT 열 값 삽입/업데이트

BigQuery
 INSERT INTO test.arrayTable VALUES (DEFAULT);

UPDATE test.arrayTable
SET col1 = DEFAULT
WHERE TRUE;

SELECT col1 FROM test.arrayTable;
Copy
Snowflake
 INSERT INTO test.arrayTable SELECT [];

UPDATE test.arrayTable
SET col1 = DEFAULT
WHERE TRUE;

SELECT col1 FROM test.arrayTable;
Copy

NULL 값이 있는 INSERT/UPDATE

BigQuery
 INSERT INTO test.arrayTable
  SELECT
    numbers
  FROM
    (SELECT [6] AS numbers
    UNION ALL
    SELECT CAST(NULL AS ARRAY<INT64>));

UPDATE test.arrayTable
SET col1 = NULL
WHERE ARRAY_LENGTH(col1) > 1;

SELECT col1 FROM test.arrayTable ORDER BY ARRAY_LENGTH(col1);
Copy
Snowflake
INSERT INTO test.arrayTable
SELECT
  numbers
FROM
  (SELECT [6] AS numbers
  UNION ALL
  SELECT IFNULL(CAST(NULL AS ARRAY), []));

UPDATE test.arrayTable
SET col1 = IFNULL(NULL, [])
WHERE ARRAY_SIZE(col1) > 1;

SELECT col1 FROM test.arrayTable ORDER BY ARRAY_SIZE(col1);
Copy

ARRAY 연결

BigQuery
SELECT [50, 30, 12] || [22, 33, 44] AS result;
Copy
Snowflake
SELECT ARRAY_CAT([50, 30, 12], [22, 33, 44]) AS result;
Copy

매개 변수/반환 유형으로 사용되는 ARRAY

BigQuery
CREATE FUNCTION test.myArrayFunction (valuesArray ARRAY<INT64>, otherValue INTEGER)
RETURNS ARRAY<INT64>
AS
(
  valuesArray || [otherValue]
);

SELECT test.myArrayFunction([5, 20, 10], 55) AS result;
Copy
Snowflake
CREATE FUNCTION test.myArrayFunction (valuesArray ARRAY, otherValue INTEGER)
RETURNS ARRAY
AS
$$
  ARRAY_CAT(valuesArray, [otherValue])
$$;

SELECT test.myArrayFunction([5, 20, 10], 55) AS result;
Copy

Known Issues

1. 양수 범위를 벗어난 인덱스에 대한 안전하지 않은 ARRAY 액세스는 실패하지 않음

BigQuery에서 SAFE_OFFSET 또는 SAFE_ORDINAL을 사용하지 않을 때 너무 낮거나(언더플로) 너무 높은(오버플로) 인덱스 값에 대해 인덱스를 통해 배열 요소에 액세스하면 실패합니다. 그러나 Snowflake에서 오류는 언더플로 사례에만 발생하므로, 오버플로 오류가 발생하는 모든 인덱스는 NULL 값을 대신 생성합니다.

배열의 요소에 대한 안전하지 않은 액세스가 감지되는 경우 SnowConvert AI는 SSC-FDM-BQ0001을 사용하여 사용자에게 이에 대해 경고합니다.

BYTES

바이트 데이터 타입 및 사용법

설명

이진 문자열에 허용되는 최대 L바이트의 바이트 시퀀스입니다. 최대 길이는 8MB(8,388,608바이트)입니다. 자세한 내용은 BigQuery BYTES 데이터 타입을 참조하세요.

참고

BYTES 데이터 타입은 Snowflake에서 지원되지 않으며, 현재 BINARY로 변환되었습니다.

샘플 소스 패턴

BYTES 출력 형식

BigQuery에서 이진 데이터 타입의 기본 출력 형식은 ‘BASE64’이고 Snowflake에서는 ‘HEX’입니다. 이러한 이유로 이진 열을 선택하면 BASE64_ENCODE 함수가 자동으로 추가됩니다. BigQuery의 기본 형식을 유지하려면 다음을 수행합니다.

BigQuery
 CREATE OR REPLACE TABLE bytesTable
(
  COL1 BYTES,
  COL2 BYTES(20)
);

INSERT INTO bytesTable VALUES (B"01020304", B"""AABBCCDD""");
INSERT INTO bytesTable VALUES (B'''\x01\x02\x03''', B"/+A=");

SELECT COL1 FROM bytesTable;
Copy
Snowflake:
CREATE OR REPLACE TABLE bytesTable
(
  COL1 BINARY,
  COL2 BINARY(20)
);

INSERT INTO bytesTable
SELECT
  TRY_TO_BINARY('01020304', 'utf-8'),
  TRY_TO_BINARY('AABBCCDD', 'utf-8');
  
INSERT INTO bytesTable
SELECT
  TRY_TO_BINARY('\x01\x02\x03', 'utf-8'),
  TRY_TO_BINARY('/+A=', 'utf-8');
  
SELECT BASE64_ENCODE( COL1) FROM bytesTable;
Copy

자동으로 추가되지 않고 BASE64 형식으로 데이터를 확인하려는 경우 BASE64_ENCODE 함수를 사용하거나 BINARY_OUTPUT_FORMAT 형식을 설정할 수 있습니다.


BYTES 리터럴

다음 케이스는 BigQuery에서 바이트 리터럴의 형식을 지정하는 데 사용할 수 있는 형식을 나타냅니다.

 B"abc"
B'''abc'''
b"""abc"""
Copy

이러한 리터럴은 Snowflake에서 지원되지 않지만, 대신 TRY_TO_BINARY 함수를 사용하여 입력 식을 이진 값으로 변환할 수 있습니다. 이 함수는 동일한 작업을 수행하지만 오류 처리를 지원하는 TO_BINARY의 특수 버전입니다.

변환의 이진 형식은 HEX, BASE64 또는 UTF-8과 같을 수 있다는 점을 고려하는 것이 중요합니다. 기본값은 BINARY_INPUT_FORMAT 세션 매개 변수의 값입니다. 이 매개 변수가 설정되지 않은 경우, 기본값은 HEX입니다.

관찰

  • BigQuery에서 이진 데이터 타입의 기본 출력 형식은 ‘BASE64’이고 Snowflake에서는 ‘HEX’입니다. BASE64 형식으로 데이터를 확인하려는 경우 BASE64_ENCODE 함수를 사용하거나 BINARY_OUTPUT_FORMAT 형식으로 설정할 수 있습니다.

  • Snowflake에서 지원하는 유일한 형식은 HEX, BASE64 또는 UTF-8입니다. 자세한 내용은 Snowflake의 이진 입력 및 출력을 참조하세요.

  • 값 절에 데이터를 삽입하는 데 사용되는 이진 함수는 Snowflake에서 지원되지 않습니다.

GEOGRAPHY

GEOGRAPHY 데이터 타입 및 사용법

설명

점 세트 또는 지표면의 하위 세트로 표시되는 점, 라인스트링 및 다각형의 컬렉션입니다. 자세한 내용은 BigQuery GEOGRAPHY 데이터 타입을 참조하세요.

성공

Snowflake에서 지원되는 데이터 타입입니다.

샘플 소스 패턴

GEOGRAPHY 출력 형식

BigQuery의 지리 데이터 타입에 대한 기본 출력 형식은 WKT **(Well-Known Text)**이고 Snowflake에서는 **WKB(Well-Known Binary)**입니다. 이러한 이유로 지리 열을 선택하면 ST_ASWKT 함수가 자동으로 추가됩니다. 또한, 테이블의 모든 열이 선택되고 여기에 지리 열이 포함된 경우 GEOGRAPHY_OUTPUT_FORMAT이 WKT로 설정됩니다. 이는 기본 BigQuery 형식을 유지하기 위한 것입니다.

BigQuery
CREATE OR REPLACE TABLE test.geographyType
(
  COL1 GEOGRAPHY
);

INSERT INTO test.geographyType VALUES
    (ST_GEOGFROMTEXT('POINT(-122.35 37.55)')), (ST_GEOGFROMTEXT('LINESTRING(-124.20 42.00, -120.01 41.99)'));

SELECT COL1 FROM test.geographyType;
SELECT * FROM test.geographyType;	
Copy
Snowflake
CREATE OR REPLACE TABLE test.geographyType
(
  COL1 GEOGRAPHY
);

INSERT INTO test.geographyType
VALUES
    (
     --** SSC-FDM-BQ0010 - THE FUNCTION 'ST_GEOGFROMTEXT' IS NOT REQUIRED IN SNOWFLAKE. **
     'POINT(-122.35 37.55)'), (
     --** SSC-FDM-BQ0010 - THE FUNCTION 'ST_GEOGFROMTEXT' IS NOT REQUIRED IN SNOWFLAKE. **
     'LINESTRING(-124.20 42.00, -120.01 41.99)');
     
SELECT ST_ASWKT( COL1) FROM test.geographyType;
            
ALTER SESSION SET GEOGRAPHY_OUTPUT_FORMAT = 'WKT';
SELECT * FROM test.geographyType;
Copy

자동으로 추가되지 않고 WKT 형식으로 데이터를 확인하려는 경우 ST_ASWKT 함수를 사용하거나 GEOGRAPHY_OUTPUT_FORMAT 형식을 설정할 수 있습니다.


GEOGRAPHY 데이터 삽입

지리 유형 열에 데이터를 삽입하기 위해 함수가 필요하지 않으며, 이는 Snowflake에서 데이터가 WGS 84 표준을 따르는 것을 자동으로 감지하기 때문입니다.

관찰

  • 지리 데이터 타입의 기본 출력 형식은 WKT **(Well-Known Text)**이고 Snowflake에서는 **WKB(Well-Known Binary)**입니다. ST_ASWKT 함수를 사용하거나, 데이터를 WKT 형식으로 보려면 GEOGRAPHY_OUTPUT_FORMAT 형식으로 설정할 수 있습니다.

  • 값 절에 데이터를 삽입하는 데 사용되는 지리 함수는 Snowflake에서 필요하지 않습니다.

INTERVAL

간격 데이터 타입 및 사용법

설명

INTERVAL 오브젝트는 특정 시점을 참조하지 않고 지속 시간 또는 시간의 양을 나타냅니다. Snowflake에는 동등한 데이터 타입이 없으므로 Varchar(BigQuery 언어 참조 INTERVAL 데이터 타입)으로 변환됩니다.

구문

INTERVAL int64_expression datetime_part

INTERVAL datetime_parts_string starting_datetime_part TO ending_datetime_part
Copy

샘플 소스 패턴

단일 DateTime 부분이 있는 간격

BigQuery
SELECT INTERVAL 1 YEAR;

SELECT CURRENT_DATE + INTERVAL 1 YEAR, 
  CURRENT_DATE + INTERVAL 1 QUARTER,
  CURRENT_DATE + INTERVAL 1 MONTH,
  CURRENT_DATE + INTERVAL 1 WEEK,
  CURRENT_DATE + INTERVAL 1 DAY,
  CURRENT_DATE + INTERVAL 1 HOUR,
  CURRENT_DATE + INTERVAL 1 MINUTE,
  CURRENT_DATE + INTERVAL 1 SECOND;
Copy
결과
1-0 0 0:0:0
Copy
2024-10-13T00:00:00
2024-01-13T00:00:00
2023-11-13T00:00:00
2023-10-20T00:00:00
2023-10-14T00:00:00
2023-10-13T01:00:00
2023-10-13T00:01:00
2023-10-13T00:00:01

Copy
Snowflake
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0107 - INTERVAL LITERAL IS NOT SUPPORTED BY SNOWFLAKE IN THIS SCENARIO  ***/!!! INTERVAL 1 YEAR;

SELECT
CURRENT_DATE() + INTERVAL '1 year',
CURRENT_DATE() + INTERVAL '1 quarter',
CURRENT_DATE() + INTERVAL '1 month',
CURRENT_DATE() + INTERVAL '1 week',
CURRENT_DATE() + INTERVAL '1 day',
CURRENT_DATE() + INTERVAL '1 hour',
CURRENT_DATE() + INTERVAL '1 minute',
CURRENT_DATE() + INTERVAL '1 second';
Copy
결과
2024-10-13
2024-01-13
2023-11-13
2023-10-20
2023-10-14
2023-10-13 01:00:00.000
2023-10-13 00:01:00.000
2023-10-13 00:00:01.000

Copy

Snowflake는 간격 데이터 타입이 직접 쿼리되는 시나리오를 지원하지 않으며, 반대로 주어진 날짜에 대한 연산자로 사용되는 경우 간격 상수를 사용하여 해당 변환이 수행됩니다(가능한 경우).


DateTime 부분 범위가 있는 간격

BigQuery
 SELECT INTERVAL '2-1 10' YEAR TO DAY;

SELECT CURRENT_DATE + INTERVAL '2-11' YEAR TO MONTH,
  CURRENT_DATE + INTERVAL '2-11 28' YEAR TO DAY,
  CURRENT_DATE + INTERVAL '2-11 28 16' YEAR TO HOUR,
  CURRENT_DATE + INTERVAL '2-11 28 16:15' YEAR TO MINUTE,
  CURRENT_DATE + INTERVAL '2-11 28 16:15:14' YEAR TO SECOND,
  CURRENT_DATE + INTERVAL '11 28' MONTH TO DAY,
  CURRENT_DATE + INTERVAL '11 28 16' MONTH TO HOUR,
  CURRENT_DATE + INTERVAL '11 28 16:15' MONTH TO MINUTE,
  CURRENT_DATE + INTERVAL '11 28 16:15:14' MONTH TO SECOND,
  CURRENT_DATE + INTERVAL '28 16' DAY TO HOUR,
  CURRENT_DATE + INTERVAL '28 16:15' DAY TO MINUTE,
  CURRENT_DATE + INTERVAL '28 16:15:14' DAY TO SECOND,
  CURRENT_DATE + INTERVAL '16:15' HOUR TO MINUTE,
  CURRENT_DATE + INTERVAL '16:15:14' HOUR TO SECOND,
  CURRENT_DATE + INTERVAL '15:14' MINUTE TO SECOND;
Copy
결과
2-1 10 0:0:0
Copy
2026-09-13T00:00:00
2026-10-11T00:00:00
2026-10-11T16:00:00
2026-10-11T16:15:00
2026-10-11T16:15:14
2024-10-11T00:00:00
2024-10-11T16:00:00
2024-10-11T16:15:00
2024-10-11T16:15:14
2023-11-10T16:00:00
2023-11-10T16:15:00
2023-11-10T16:15:14
2023-10-13T16:15:00
2023-10-13T16:15:14
2023-10-13T00:15:14

Copy
Snowflake
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0107 - INTERVAL LITERAL IS NOT SUPPORTED BY SNOWFLAKE IN THIS SCENARIO  ***/!!! INTERVAL '2-1 10' YEAR TO DAY;

SELECT
CURRENT_DATE() + INTERVAL '2y, 11mm',
CURRENT_DATE() + INTERVAL '2y, 11mm, 28d',
CURRENT_DATE() + INTERVAL '2y, 11mm, 28d, 16h',
CURRENT_DATE() + INTERVAL '2y, 11mm, 28d, 16h, 15m',
CURRENT_DATE() + INTERVAL '2y, 11mm, 28d, 16h, 15m, 14s',
CURRENT_DATE() + INTERVAL '11mm, 28d',
CURRENT_DATE() + INTERVAL '11mm, 28d, 16h',
CURRENT_DATE() + INTERVAL '11mm, 28d, 16h, 15m',
CURRENT_DATE() + INTERVAL '11mm, 28d, 16h, 15m, 14s',
CURRENT_DATE() + INTERVAL '28d, 16h',
CURRENT_DATE() + INTERVAL '28d, 16h, 15m',
CURRENT_DATE() + INTERVAL '28d, 16h, 15m, 14s',
CURRENT_DATE() + INTERVAL '16h, 15m',
CURRENT_DATE() + INTERVAL '16h, 15m, 14s',
CURRENT_DATE() + INTERVAL '15m, 14s';
Copy
결과
2026-09-13
2026-10-11
2026-10-11 16:00:00.000
2026-10-11 16:15:00.000
2026-10-11 16:15:14.000
2024-10-11
2024-10-11 16:00:00.000
2024-10-11 16:15:00.000
2024-10-11 16:15:14.000
2023-11-10 16:00:00.000
2023-11-10 16:15:00.000
2023-11-10 16:15:14.000
2023-10-13 16:15:00.000
2023-10-13 16:15:14.000
2023-10-13 00:15:14.000
Copy

간격 값은 지원되는 Snowflake 형식으로 변환된 다음 열 내부에 텍스트로 삽입됩니다. Snowflake는 간격을 데이터 타입으로 지원하지 않으므로 산술 연산에서만 지원됩니다. 값을 사용하려면 이 값을 추출하여 간격 상수로 사용해야 합니다(가능한 경우).


열 데이터 타입으로서의 간격

BigQuery
 CREATE OR REPLACE TABLE test.my_table (
  id INT NOT NULL,
  interval_column INTERVAL
);

INSERT INTO test.my_table
VALUES (1, INTERVAL '2-11 28' YEAR TO DAY);

INSERT INTO test.my_table
VALUES (2, INTERVAL '2-11 28 16:15:14' YEAR TO SECOND);

INSERT INTO test.my_table
VALUES (3, INTERVAL '11 28 16:15:14' MONTH TO SECOND);

INSERT INTO test.my_table
VALUES (4, INTERVAL '15:14' MINUTE TO SECOND);

SELECT * FROM test.my_table;
Copy
결과

ID

interval_column

1

2-11 28 0:0:0

2

2-11 28 16:15:14

3

0-11 28 16:15:14

4

0-0 0 0:15:14

Snowflake
 CREATE OR REPLACE TABLE test.my_table (
  id INT NOT NULL,
interval_column VARCHAR(30) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DATA TYPE CONVERTED TO VARCHAR ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "bigquery",  "convertedOn": "04/01/2025",  "domain": "test" }}';

INSERT INTO test.my_table
VALUES (1, '2y, 11mm, 28d');

INSERT INTO test.my_table
VALUES (2, '2y, 11mm, 28d, 16h, 15m, 14s');

INSERT INTO test.my_table
VALUES (3, '11mm, 28d, 16h, 15m, 14s');

INSERT INTO test.my_table
VALUES (4, '15m, 14s');

SELECT * FROM
test.my_table;
Copy
결과

ID

interval_column

1

2y, 11mm, 28d

2

2y, 11mm, 28d, 16h, 15m, 14s

3

11mm, 28d, 16h, 15m, 14s

4

15m, 14s

BigQuery에서 datetime_part는 다음 표준 형식을 따릅니다.

[sign]Y-M [sign]D [sign]H:M:S[.F]

Copy

간격 비교

BigQuery
SELECT INTERVAL 1 YEAR = INTERVAL 1 YEAR;

SELECT CURRENT_DATE + INTERVAL '-2 -16' DAY TO HOUR =  CURRENT_DATE + INTERVAL '-2 -16' DAY TO HOUR;

SELECT INTERVAL '-2 -16' DAY TO HOUR != INTERVAL '-2 16' DAY TO HOUR,
  INTERVAL '-2 -16' DAY TO HOUR <> INTERVAL '-2 16' DAY TO HOUR,
  INTERVAL '2 16:15' DAY TO MINUTE = INTERVAL '2 -16:15' DAY TO MINUTE,
  INTERVAL '2 16:15' DAY TO MINUTE > INTERVAL '2 -16:15' DAY TO MINUTE,
  INTERVAL '2 16:15' DAY TO MINUTE >= INTERVAL '2 -16:15' DAY TO MINUTE,
  INTERVAL '2 16:15' DAY TO MINUTE < INTERVAL '2 -16:15' DAY TO MINUTE,
  INTERVAL '2 16:15' DAY TO MINUTE <= INTERVAL '2 -16:15' DAY TO MINUTE,
  INTERVAL '1-5' YEAR TO MONTH = INTERVAL '1-5' YEAR TO MONTH,
  INTERVAL '1-5' YEAR TO MONTH > INTERVAL '2 16' DAY TO HOUR,
  INTERVAL '2-11 28 16:15:14.222' YEAR TO SECOND = INTERVAL '2-11 28 16:15:14.222' YEAR TO SECOND,
  INTERVAL '1-1 3' YEAR TO DAY = INTERVAL '13 3' MONTH TO DAY,
  INTERVAL '1-5' YEAR TO MONTH > INTERVAL '2 16' DAY TO HOUR;
Copy
Snowflake
SELECT
'1 year' = '1 year';

SELECT
CURRENT_DATE() + INTERVAL '-2d, -16h' = CURRENT_DATE() + INTERVAL '-2d, -16h';

SELECT
CURRENT_TIMESTAMP + INTERVAL '-2d, -16h' != CURRENT_TIMESTAMP + INTERVAL '-2d, 16h',
CURRENT_TIMESTAMP + INTERVAL '-2d, -16h' <> CURRENT_TIMESTAMP + INTERVAL '-2d, 16h',
CURRENT_TIMESTAMP + INTERVAL '2d, 16h, 15m' = CURRENT_TIMESTAMP + INTERVAL '2d, -16h, -15m',
CURRENT_TIMESTAMP + INTERVAL '2d, 16h, 15m' > CURRENT_TIMESTAMP + INTERVAL '2d, -16h, -15m',
CURRENT_TIMESTAMP + INTERVAL '2d, 16h, 15m' >= CURRENT_TIMESTAMP + INTERVAL '2d, -16h, -15m',
CURRENT_TIMESTAMP + INTERVAL '2d, 16h, 15m' < CURRENT_TIMESTAMP + INTERVAL '2d, -16h, -15m',
CURRENT_TIMESTAMP + INTERVAL '2d, 16h, 15m' <= CURRENT_TIMESTAMP + INTERVAL '2d, -16h, -15m',
CURRENT_TIMESTAMP + INTERVAL '1y, 5mm' = CURRENT_TIMESTAMP + INTERVAL '1y, 5mm',
CURRENT_TIMESTAMP + INTERVAL '1y, 5mm' > CURRENT_TIMESTAMP + INTERVAL '2d, 16h',
CURRENT_TIMESTAMP + INTERVAL '2y, 11mm, 28d, 16h, 15m, 14s, 222ms' = CURRENT_TIMESTAMP + INTERVAL '2y, 11mm, 28d, 16h, 15m, 14s, 222ms',
CURRENT_TIMESTAMP + INTERVAL '1y, 1mm, 3d' = CURRENT_TIMESTAMP + INTERVAL '13mm, 3d',
CURRENT_TIMESTAMP + INTERVAL '1y, 5mm' > CURRENT_TIMESTAMP + INTERVAL '2d, 16h';
Copy

알려진 바와 같이, Snowflake는 산술 연산에서 간격만 데이터 타입으로 지원하므로 비교를 올바르게 지원하기 위해 CURRENT_TIMESTAMP 함수가 각 피연산자에 추가됩니다.

Known Issues

1. Only arithmetic operations are supported

Snowflake 간격에는 몇 가지 제한 사항이 있습니다. DATE 또는 TIMESTAMP간격 상수 간의 산술 연산만 지원되며, 다른 모든 시나리오는 지원되지 않습니다.

2. Working with signs in the Interval data type

BigQuery에서, 연도-월에 해당하는 하위 문자열 앞에 기호(+ -)가 붙으면 연도와 월 모두에 영향을 줍니다. 유사한 방식으로, 이는 시간에 해당하는 하위 문자열에 대해 작동하며, 이 경우 다음은 시, 분, 초에 영향을 줍니다. 이에 대한 예가 아래에 나와 있습니다.

BigQuery
SELECT CURRENT_DATE + INTERVAL '-2-11 -28 -16:15:14.222' YEAR TO SECOND;
Copy
Snowflake
 SELECT CURRENT_DATE + INTERVAL '-2y, -11mm, -28d, -16h, -15m, -14s, -222ms';
Copy

관련 EWIs

  1. SSC-EWI-0036: 데이터 타입이 다른 데이터 타입으로 변환되었습니다.

  2. SSC-EWI-0107: 현재 시나리오에서 간격 리터럴이 지원되지 않습니다.

JSON

Json 데이터 타입 및 사용법

설명

가벼운 데이터 교환 형식인 JSON을 나타냅니다. 자세한 내용은 BigQuery JSON 데이터 타입을 참조하세요.

위험

JSON 데이터 타입은 Snowflake에서 지원되지 않으며, 현재 VARIANT로 변환되었습니다.


JSON 리터럴

 JSON 'json_formatted_data'
Copy

자세한 내용은 BigQuery의 JSON 리터럴을 참조하세요.

이러한 리터럴은 Snowflake에서 지원되지 않지만, 대신 PARSE_JSON 함수를 사용하여 입력 식을 json 유형으로 변환할 수 있습니다. 고려해야 할 유일한 점은, 이 함수는 Snowflake의 값 절에서 사용할 수 없기 때문에 하위 쿼리로 변환된다는 것입니다.

샘플 소스 패턴

BigQuery

CREATE OR REPLACE TABLE test.jsonType
(
  COL1 JSON
);

INSERT INTO test.jsonType
VALUES
  (JSON'{"name": "John", "age": 30, "city": "New York"}'), 
  (JSON'{"name": "Alice", "age": 28, "city": "San Francisco"}');  
  
SELECT * FROM test.jsonType;

SELECT JSON'{"name": "John", "age": 30, "city": "New York"}';
Copy

Snowflake

CREATE OR REPLACE TABLE test.jsonType
(
  COL1 VARIANT
);

INSERT INTO test.jsonType
SELECT
  PARSE_JSON('{"name": "John", "age": 30, "city": "New York"}')
UNION ALL
SELECT
  PARSE_JSON('{"name": "Alice", "age": 28, "city": "San Francisco"}');

SELECT * FROM test.jsonType;

SELECT
  PARSE_JSON('{"name": "John", "age": 30, "city": "New York"}');
Copy

STRUCT

STRUCT 데이터 타입을 BigQuery에서 Snowflake로 변환하기 위한 변환 사양

설명

BigQuery에서 각각 유형(필수)과 필드 이름(선택 사항)이 있는 정렬된 필드의 컨테이너입니다. 구조체 유형을 참조하세요.

Snowflake에서 OBJECT_CONSTRUCT를 사용하여 STRUCT 동작을 처리할 수 있으며, SnowConvert AI는 대부분의 구현 차이점을 처리합니다.

참고

OBJECT_CONSTRUCT 내의 키를 나타내는 인자는 대상 STRUCT의 원본 이름이어야 합니다. STRUCT 식 본문 내에 지정된 모든 이름은 대상 STRUCT에서 발견된 이름으로 바뀝니다. 아래 대부분의 데이터 패턴 예에는 대상 이름으로 대체되는 이름의 예가 포함되어 있습니다.

샘플 소스 패턴

BigQuery

CREATE OR REPLACE TABLE test.structTypes
(
    COL1 STRUCT<sc1 INT64>,
    COL2 STRUCT<sc2 STRING(10)>,
    COL3 STRUCT<sc3 STRUCT<sc31 INT64, sc32 INT64>>,
    COL4 STRUCT<sc4 ARRAY<INT64>>,
    COL5 STRUCT<sc5 INT64, sc51 INT64>,
    COL7 STRUCT<sc7 INT64 OPTIONS(description = "A repeated STRING field"), sc71 BOOL>,
    COL8 STRUCT<sc8 INT64 NOT NULL, sc81 BOOL NOT NULL OPTIONS(description = "A repeated STRING field")>
);
    
CREATE OR REPLACE TABLE test.tuple_sample (
  COL1 STRUCT<Key1 INT64, Key2 INT64>
);
Copy

Snowflake

CREATE OR REPLACE TABLE test.structTypes
(
    COL1 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<INT> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL2 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<STRING(10)> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL3 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<STRUCT<INT64, INT64>> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL4 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL5 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<INT, INT> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL7 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<INT, BOOLEAN> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL8 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<INT, BOOLEAN> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/
);

CREATE OR REPLACE TABLE test.tuple_sample (
  COL1 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<INT, INT> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/
);
Copy

INT데이터 타입을 STRUCT 열에 삽입

BigQuery
INSERT INTO test.structTypes (COL1) VALUES
(STRUCT(1)), 
(STRUCT<INT64>(2)), 
(STRUCT<a INT64>(3)), 
(STRUCT<sc1 INT64>(4)), 
(STRUCT<sc1 INT64>(5));
Copy
Snowflake
INSERT INTO test.structTypes (COL1)
SELECT
    OBJECT_CONSTRUCT('sc1', 1 :: INT)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc1', 2 :: INT)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc1', 3 :: INT)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc1', 4 :: INT)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc1', 5 :: INT);
Copy

STRING데이터 타입을 STRUCT 열에 삽입

BigQuery
INSERT INTO test.structTypes (COL2) VALUES
(STRUCT('t1')), 
(STRUCT<STRING>('t2')), 
(STRUCT<sc2 STRING>('t3'));
Copy
Snowflake
INSERT INTO test.structTypes (COL2)
SELECT
    OBJECT_CONSTRUCT('sc2', 't1' :: STRING)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc2', 't2' :: STRING)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc2', 't3' :: STRING);
Copy

STRUCT데이터 타입을 STRUCT 열에 삽입

BigQuery
INSERT INTO test.structTypes (COL3) VALUES
(STRUCT(STRUCT(1,2))), 
(STRUCT<sc3 STRUCT<sc31 INT64, sc32 INT64>>(STRUCT<INT64, INT64>(3, 4))),
(STRUCT<sc3 STRUCT<sc31 INT64, sc32 INT64>>(STRUCT<sc31 INT64, sc32 INT64>(5, 6))),
(STRUCT<STRUCT<INT64,INT64>>(STRUCT<INT64, INT64>(7, 8))),
(STRUCT<STRUCT<INT64,INT64>>(STRUCT(9, 10)));
Copy
Snowflake
INSERT INTO test.structTypes (COL3)
SELECT
  OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 1 :: INT, 'sc32', 2 :: INT))
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 3 :: INT, 'sc32', 4 :: INT))
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 5 :: INT, 'sc32', 6 :: INT))
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 7 :: INT, 'sc32', 8 :: INT))
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 9 :: INT, 'sc32', 10 :: INT));
Copy

ARRAY데이터 타입을 STRUCT 열에 삽입

BigQuery
INSERT INTO test.structTypes (COL4) VALUES
(STRUCT([1,2,3,4])), 
(STRUCT<sc4 ARRAY<INT64>>(ARRAY[5,6,7])), 
(STRUCT<ARRAY<INT64>>([8,9,10,11]));
Copy
Snowflake
INSERT INTO test.structTypes (COL4)
SELECT
  OBJECT_CONSTRUCT('sc4', [1,2,3,4] :: ARRAY)
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc4', [5,6,7] :: ARRAY)
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc4', [8,9,10,11] :: ARRAY);
Copy

선택한 STRUCT 열에 삽입

BigQuery
INSERT INTO test.structTypes (COL7, COL8) VALUES
(STRUCT(1,true), STRUCT(2,false)), 
(STRUCT<INT64, BOOL>(3, false), STRUCT<INT64, BOOL>(4, false)), 
(STRUCT<a INT64, b BOOL>(5, true), STRUCT<a INT64, b BOOL>(6, true));
Copy
Snowflake
INSERT INTO test.structTypes (COL7, COL8)
SELECT
  OBJECT_CONSTRUCT('sc7', 1 :: INT, 'sc71', true),
  OBJECT_CONSTRUCT('sc8', 2 :: INT, 'sc81', false)
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc7', 3 :: INT, 'sc71', false),
  OBJECT_CONSTRUCT('sc8', 4 :: INT, 'sc81', false)
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc7', 5 :: INT, 'sc71', true),
  OBJECT_CONSTRUCT('sc8', 6 :: INT, 'sc81', true);
Copy

STRUCT 열 튜플 구문에 삽입

경고

튜플 구문 값의 변환은 현재 지원되지 않습니다.

BigQuery
INSERT INTO test.tuple_sample
VALUES
  ((12, 34)),
  ((56, 78)),
  ((9, 99)),
  ((12, 35));
Copy
Snowflake
INSERT INTO test.tuple_sample
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0012 - UNABLE TO GENERATE CORRECT OBJECT_CONSTRUCT PARAMETER. SYMBOL INFORMATION COULD NOT BE COLLECTED. ***/!!!
VALUES
  ((12, 34)),
  ((56, 78)),
  ((9, 99)),
  ((12, 35));
Copy



STRUCT 열 업데이트

BigQuery
UPDATE test.structTypes
SET col1 = STRUCT(100 AS number)
WHERE col1.sc1 = 4;
Copy
Snowflake
UPDATE test.structTypes
    SET col1 = OBJECT_CONSTRUCT('sc1', 100 :: INT)
WHERE col1:sc1 = 4;
Copy

STRUCT 열 필드 업데이트

BigQuery
UPDATE test.structTypes
SET col3 = STRUCT(STRUCT(80,90))
WHERE col3.sc3.sc31 = 20;
Copy
Snowflake
UPDATE test.structTypes
SET col3 = OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 80 :: INT, 'sc32', 90 :: INT))
WHERE col3:sc3:sc31 = 20;
Copy

STRUCT 열에서 선택

BigQuery
SELECT COL3.sc3 FROM test.structTypes;
SELECT COL3.sc3.sc32 FROM test.structTypes;
SELECT COL4.sc4 FROM test.structTypes WHERE COL4.sc4 IS NOT NULL;
Copy
Snowflake
SELECT COL3:sc3
FROM
test.structTypes;
SELECT COL3:sc3:sc32
FROM
test.structTypes;
SELECT COL4:sc4
FROM
test.structTypes
WHERE COL4:sc4 IS NOT NULL;
Copy

STRUCT 열 튜플 구문에서 선택

BigQuery
SELECT *
FROM test.tuple_sample
WHERE (COL1.Key1, COL1.Key2) IN ((12, 34), (56, 78));

SELECT STRUCT<x ARRAY<INT64>, y INT64>(COL4.sc4, COL1.sc1)
FROM test.structTypes
WHERE COL1.sc1 IS NOT NULL;
Copy
Snowflake
SELECT *
FROM
test.tuple_sample
WHERE (COL1:Key1, COL1:Key2) IN ((12, 34), (56, 78));

SELECT
OBJECT_CONSTRUCT('x', COL4:sc4 :: ARRAY, 'y', COL1:sc1 :: INT)
FROM
test.structTypes
WHERE COL1:sc1 IS NOT  NULL;
Copy

익명 STRUCT 정의를 사용하여 뷰 만들기

BigQuery
CREATE OR REPLACE TABLE project-test.mydataset.sourcetable (
  id STRING,
  payload JSON
);

CREATE VIEW project-test.mydataset.myview AS 
SELECT
  id,
  STRUCT(
    payload.user_id AS user_id,
    STRUCT(
      JSON_VALUE(payload, '$.details.ip_address') AS ip_address,
      JSON_VALUE(payload, '$.details.item_id') AS item_id,
      SAFE_CAST(JSON_VALUE(payload, '$.details.quantity') AS INT64) AS quantity,
      SAFE_CAST(JSON_VALUE(payload, '$.details.price') AS FLOAT64) AS price,
      JSON_VALUE(payload, '$.details.text') AS text
    ) AS details
  ) AS structured_payload
  FROM project-test.mydataset.sourcetable;
Copy
Snowflake
CREATE OR REPLACE TABLE "project-test".mydataset.sourcetable (
  id STRING,
  payload VARIANT
);

CREATE VIEW "project-test".mydataset.myview
AS
SELECT
  id,
  OBJECT_CONSTRUCT('user_id',
  payload:user_id, 'details', OBJECT_CONSTRUCT('ip_address', JSON_EXTRACT_PATH_TEXT(payload, 'details.ip_address'), 'item_id', JSON_EXTRACT_PATH_TEXT(payload, 'details.item_id'), 'quantity', TRY_CAST(JSON_EXTRACT_PATH_TEXT(payload, 'details.quantity') AS INT), 'price', TRY_CAST(JSON_EXTRACT_PATH_TEXT(payload, 'details.price') AS FLOAT), 'text', JSON_EXTRACT_PATH_TEXT(payload, 'details.text'))) AS structured_payload
  FROM
  "project-test".mydataset.sourcetable;
Copy

STRUCT 열 비교 식

구조체에 대한 BigQuery 비교 연산은 값끼리 비교하면서 키가 있는 경우 이를 무시하는 반면, 오브젝트에 대한 Snowflake 비교 연산은 값과 키를 모두 비교합니다. 이로 인해 일부 비교에서는 다른 결과가 반환될 수 있습니다.

BigQuery
SELECT * FROM test.structTypes WHERE COL1 NOT IN (COL2);
SELECT * FROM test.structTypes WHERE COL1 <> (COL2);
SELECT * FROM test.structTypes WHERE COL1 != (COL2);
Copy
Snowflake
SELECT * FROM
test.structTypes
--** SSC-FDM-BQ0008 - WHERE CLAUSE REFERENCES A COLUMN OF STRUCT TYPE. COMPARISON OPERATIONS MAY PRODUCE DIFFERENT RESULTS IN SNOWFLAKE. **
WHERE COL1 NOT IN (COL2);
SELECT * FROM
test.structTypes
--** SSC-FDM-BQ0008 - WHERE CLAUSE REFERENCES A COLUMN OF STRUCT TYPE. COMPARISON OPERATIONS MAY PRODUCE DIFFERENT RESULTS IN SNOWFLAKE. **
WHERE COL1 <> (COL2);
SELECT * FROM
test.structTypes
--** SSC-FDM-BQ0008 - WHERE CLAUSE REFERENCES A COLUMN OF STRUCT TYPE. COMPARISON OPERATIONS MAY PRODUCE DIFFERENT RESULTS IN SNOWFLAKE. **
WHERE COL1 != (COL2);
Copy

관련 EWIs

  1. SSC-FDM-BQ0010: 구조체가 VARIANT로 변환되었습니다. 일부 사용법에 기능적 차이가 있을 수 있습니다.

  2. SSC-EWI-BQ0012: 올바른 OBJECT_CONSTRUCT 매개 변수를 생성할 수 없습니다.

  3. SSC-FDM-BQ0008: Where 절은 STRUCT 유형의 열을 참조합니다.

TIMESTAMP

타임스탬프 데이터 타입 및 사용법

설명

타임스탬프 값은 일광 절약 시간제(DST)와 같은 타임존 또는 규칙에 관계없이 마이크로초 단위의 전체 자릿수로 절대 시점을 나타냅니다. 자세한 내용은 BigQuery 타임스탬프 데이터 타입을 참조하세요.

문법 구문

NameRange
TIMESTAMP0001-01-01 00:00:00 to 9999-12-31 23:59:59.999999 UTC

성공

TIMESTAMP 데이터 타입은 현재TIMESTAMP_TZ로 변환되었습니다.

BigQuery는 TIMESTAMP 데이터를 협정 세계시(UTC)로 저장한다는 점에 유의해야 합니다.

샘플 소스 패턴

시간이 없는 TIMESTAMP

BigQuery
 CREATE OR REPLACE TABLE timestampTable
(
  COL1 TIMESTAMP
);

INSERT INTO timestampTable VALUES ('2008-12-26 15:30:00');
INSERT INTO timestampTable VALUES (TIMESTAMP'2008-12-27 18:30:00');
SELECT * FROM timestampTable;
Copy
결과
2008-12-26 15:30:00 UTC
2008-12-27 18:30:00 UTC

Copy
Snowflake
CREATE OR REPLACE TABLE timestampTable
(
  COL1 TIMESTAMP_TZ
);

INSERT INTO timestampTable VALUES ('2008-12-26 15:30:00');
INSERT INTO timestampTable VALUES (TIMESTAMP'2008-12-27 18:30:00');
SELECT * FROM timestampTable;
Copy
결과
2008-12-26 15:30:00.000 -0800
2008-12-27 18:30:00.000 -0800

Copy

타임존이 있는 TIMESTAMP

타임존이 정의되면 CONVERT_TIMEZONE 함수를 사용하여 데이터를 협정 세계시(UTC)로 저장해야 합니다. 또한 타임스탬프 리터럴 내의 타임존 이름은 Snowflake에서 지원되지 않으므로, 이 경우에도 이 함수를 사용해야 합니다.

BigQuery
CREATE OR REPLACE TABLE test.timestampType
(
  COL1 TIMESTAMP
);

INSERT INTO test.timestampType VALUES ('2008-12-25 15:30:00 America/Chicago');
INSERT INTO test.timestampType VALUES ('2018-04-05 12:00:00+02:00');
INSERT INTO test.timestampType VALUES ('2008-12-26 15:30:00-08:00');
INSERT INTO test.timestampType VALUES (TIMESTAMP'2022-12-25 15:30:00 America/North_Dakota/New_Salem');
INSERT INTO test.timestampType VALUES (TIMESTAMP'2022-04-05 12:00:00+02:00');
INSERT INTO test.timestampType VALUES (TIMESTAMP'2022-12-26 15:30:00-08:00');
SELECT * FROM test.timestampType ORDER BY COL1;
Copy
결과
2008-12-25 21:30:00 UTC	
2008-12-26 23:30:00 UTC	
2018-04-05 10:00:00 UTC	
2022-04-05 10:00:00 UTC	
2022-12-25 21:30:00 UTC	
2022-12-26 23:30:00 UTC
Copy
Snowflake
CREATE OR REPLACE TABLE test.timestampType
(
  COL1 TIMESTAMP_TZ
);

INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('America/Chicago', 'UTC', '2008-12-25 15:30:00'));
INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('UTC','2018-04-05 12:00:00+02:00'));
INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('UTC','2008-12-26 15:30:00-08:00'));

INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('America/North_Dakota/New_Salem', 'UTC', '2022-12-25 15:30:00'));
INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('UTC', '2022-04-05 12:00:00+02:00'));
INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('UTC', '2022-12-26 15:30:00-08:00'));
SELECT * FROM test.timestampType ORDER BY COL1;
Copy
결과
 2008-12-25 21:30:00.000 -0800
2008-12-26 23:30:00.000 +0000
2018-04-05 10:00:00.000 +0000
2022-04-05 10:00:00.000 +0000
2022-12-25 21:30:00.000 -0800
2022-12-26 23:30:00.000 +0000
Copy