SnowConvert AI - Redshift - Data types

Current Data types conversion for Redshift in SnowConvert AI.

Snowflake 支持最基本的 SQL 数据类型(存在部分限制),用于列、局部变量、表达式、参数和任何其他适当/合适的位置。

数值数据类型

Redshift

Snowflake

备注

INT

INT

Snowflake 的 INT 是 NUMBER 的别名。

INT2

SMALLINT

Snowflake 的 INT2 是 NUMBER 的别名。

INT4

INTEGER

Snowflake 的 INT4 是 NUMBER 的别名。

INT8

INTEGER

Snowflake 的 INT8 是 NUMBER 的别名。

INTEGER

INTEGER

Snowflake 的 INTEGER 是 NUMBER 的别名。

BIGINT

BIGINT

Snowflake 的 BIGINT 是 NUMBER 的别名。

DECIMAL

DECIMAL

Snowflake 的 DECIMAL 是 NUMBER 的别名。

DOUBLE PRECISION

DOUBLE PRECISION

Snowflake 的 DOUBLE PRECISION 是 FLOAT 的别名。

NUMERIC​

NUMERIC

Snowflake 的 NUMERIC 是 NUMBER 的别名。

SMALLINT

SMALLINT

Snowflake 的 SMALLINT 是 NUMBER 的别名。

FLOAT

FLOAT

Snowflake 使用双精度(64 位)IEEE 754 浮点数。

FLOAT4

FLOAT4

Snowflake 的 FLOAT4 是 FLOAT 的别名。

FLOAT8

FLOAT8

Snowflake 的 FLOAT8 是 FLOAT 的别名。

REAL

REAL​

Snowflake 的 REAL 是 FLOAT 的别名。

字符类型

Redshift

Snowflake

备注

VARCHAR

VARCHAR

VARCHAR 存储 Unicode UTF-8 字符。如果未指定长度,则默认值为允许的最大长度 (16,777,216)。

CHAR

CHAR

Snowflake 的 CHAR 是 VARCHAR 的别名。

CHARACTER

CHARACTER

Snowflake 的 CHARACTER 是 VARCHAR 的别名。

NCHAR

NCHAR

Snowflake 的 NCHAR 是 VARCHAR 的别名。

BPCHAR

VARCHAR

Snowflake 不支持 BPCHAR 数据类型。改用 VARCHAR。如需了解更多信息,请参阅 SSC-FDM-PG0002

NVARCHAR

NVARCHAR

Snowflake 的 NVARCHAR 是 VARCHAR 的别名。

CHARACTER VARYING

CHARACTER VARYING

Snowflake 的 CHARACTER VARYING 是 VARCHAR 的别名。

NATIONAL CHARACTER

NCHAR

Snowflake 的 NCHAR 是 VARCHAR 的别名。

NATIONAL CHARACTER VARYING

NCHAR VARYING

Snowflake 的 NCHAR VARYING 是 VARCHAR 的别名。

TEXT

TEXT

Snowflake 的 TEXT 是 VARCHAR 的别名。

NAME (https://www.postgresql.org/docs/current/datatype-character.html)(特殊字符类型)

VARCHAR

VARCHAR 存储 Unicode UTF-8 字符。如果未指定长度,则默认值为允许的最大长度 (16,777,216)。

备注

当 Redshift 数据类型中存在 MAX 精度实参时,它们将被转换为 Snowflake 支持的默认最大精度。

布尔类型

Redshift

Snowflake

备注

BOOL

BOOLEAN

BOOLEAN

BOOLEAN

二进制数据类型

Redshift

Snowflake

备注

VARBYTE

VARBINARY

VARBINARY 是 BINARY 的同义词。

VARBINARY

VARBINARY

VARBINARY 是 BINARY 的同义词。

BINARY

BINARY

最大长度为 8 MB(8,388,608 字节)

BINARY VARYING

BINARY VARYING

BINARY VARYING 是 BINARY 的同义词。

警告

在 Redshift 中,二进制类型的最大长度为 16 MB(16,777,216 字节),但在 Snowflake 中,二进制类型的最大长度为 8 MB(8,388,608 字节)。请留意在最大长度上的减少。

日期和时间数据类型

Redshift

Snowflake

备注

DATE

DATE

DATE 可接受最常见的日期形式(YYYY-MM-DDDD-MON-YYYY 等)。

TIME

TIME

HH:MI:SS 的形式存储时间。时间精度的范围为 0(秒)到 9(纳秒)。默认精度为 9。

TIMETZ

TIME

时间数据类型不支持时区。如需了解更多信息,请参阅 SSC-FDM-0005

TIME WITH TIME ZONE

TIME

时间数据类型不支持时区。如需了解更多信息,请参阅 SSC-FDM-0005

TIME WITHOUT TIME ZONE

TIME

Snowflake 支持以 HH:MI:SS 的形式存储时间的单一 TIME 数据类型。

TIMESTAMP

TIMESTAMP

时间戳精度的范围为 0(秒)到 9(纳秒)。

TIMESTAMPTZ

TIMESTAMP_TZ

TIMESTAMP_TZ 在内部存储 UTC 时间及关联的 时区偏移

TIMESTAMP WITH TIME ZONE

TIMESTAMP_TZ

TIMESTAMP_TZ 在内部存储 UTC 时间及关联的 时区偏移

TIMESTAMP WITHOUT TIME ZONE

TIMESTAMP_NTZ

TIMESTAMP_NTZ 在内部存储具有指定精度的“挂钟”时间。

INTERVAL YEAR TO MONTH

VARCHAR

Snowflake 不支持 interval 数据类型。已转换为 VARCHAR。

INTERVAL DAY TO SECOND

VARCHAR

Snowflake 不支持 interval 数据类型。已转换为 VARCHAR。

其他数据类型

Redshift

Snowflake

备注

GEOMETRY

GEOMETRY

坐标表示为实数对 (x, y)。目前,仅支持 2D 坐标。

GEOGRAPHY

GEOGRAPHY

GEOGRAPHY 数据类型遵循 WGS 84 标准。

HLLSKETCH

不适用

Snowflake 不支持的数据类型。如需了解更多信息,请参阅 SSC-EWI-RS0004

SUPER

VARIANT

可以包含其他任何数据类型的值,包括 OBJECT 和 ARRAY 值。

INTERVAL DAY TO SECOND 数据类型

描述

INTERVAL DAY TO SECOND 指定间隔字面量,以定义以天、小时、分钟和秒为单位的持续时间。(RedShift SQL 语言参考“Interval 数据类型” (https://docs.aws.amazon.com/redshift/latest/dg/r_interval_data_types.html#r_interval_data_types-syntax))

在 Snowflake 中没有该数据类型的等效项,它目前转换为 VARCHAR

语法

 INTERVAL day_to_second_qualifier [ (fractional_precision) ]

day_to_second_qualifier:
{ DAY | HOUR | MINUTE | SECOND | DAY TO HOUR | DAY TO MINUTE | DAY TO SECOND | 
HOUR TO MINUTE | HOUR TO SECOND | MINUTE TO SECOND }
Copy

警告

计划在未来的更新中实现 Interval 数据类型的使用。

示例源模式

Create Table 中的 Interval Day to Second

输入
Redshift
 CREATE TABLE interval_day_to_second_table
(
	interval_day_col1 INTERVAL DAY TO HOUR,
	interval_day_col2 INTERVAL DAY TO SECOND(4)
);

INSERT INTO interval_day_to_second_table(interval_day_col1) VALUES ( INTERVAL '1 2' DAY TO HOUR ); 
INSERT INTO interval_day_to_second_table(interval_day_col2) VALUES ( INTERVAL '1 2:3:4.56' DAY TO SECOND(4));
Copy
输出
Snowflake
 CREATE TABLE interval_day_to_second_table
(
	interval_day_col1 VARCHAR !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY TO HOUR DATA TYPE CONVERTED TO VARCHAR ***/!!!,
	interval_day_col2 VARCHAR !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY TO SECOND(4) DATA TYPE CONVERTED TO VARCHAR ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"redshift"}}'
;

INSERT INTO interval_day_to_second_table(interval_day_col1) VALUES ('1days, 2hours');

INSERT INTO interval_day_to_second_table(interval_day_col2) VALUES ('1days, 2hours, 3mins, 4secs, 56ms');
Copy

Interval 值将转换为受支持的 Snowflake 格式,然后以文本形式插入到列中。由于 Snowflake 不支持 Interval 数据类型,因此仅在算术运算中支持这样做。若要使用该值,需要将其提取出来并用作 Interval 常量(如果可能的话)。

原始 Oracle 值: INTERVAL '1 2:3:4.567' DAY TO SECOND

存储在 Snowflake 列中的值: '1days, 2hours, 3mins, 4secs, 56ms'

作为 Snowflake Interval 常量的值: INTERVAL '1days, 2hours, 3mins, 4secs, 56ms'

从“Interval Day to Second”列检索数据

输入
Redshift
 SELECT * FROM interval_day_to_second_table;
Copy
Result

interval_day_col1

interval_day_col2

1 days 2 hours 0 mins 0.0 secs

NULL

NULL

1 days 2 hours 3 mins 4.56 secs

输出
Snowflake
 SELECT * FROM
interval_day_to_second_table;
Copy
Result

interval_day_col1

interval_day_col2

1d, 2h

NULL

NULL

1d, 2h, 3m, 4s, 56ms

已知问题

1.仅支持算术运算

Snowflake Interval 存在几项限制。仅支持 DATETIMESTAMPInterval 常量 之间的算术运算,不支持其他任何场景。

相关的 EWIs

  1. SSC-EWI-0036:数据类型转换为另一种数据类型。

INTERVAL YEAR TO MONTH 数据类型

描述

INTERVAL YEAR TO MONTH 指定 interval 数据类型,以存储以年和月为单位的持续时间。(RedShift SQL 语言参考“Interval 数据类型” (https://docs.aws.amazon.com/redshift/latest/dg/r_interval_data_types.html#r_interval_data_types-syntax))

在 Snowflake 中没有该数据类型的等效项,它目前转换为 VARCHAR。

语法

 INTERVAL {YEAR | MONTH | YEAR TO MONTH}
Copy

警告

计划在未来的更新中实现 Interval 数据类型的使用。

示例源模式

Create Table 中的 Interval Year To Month

输入:
Redshift
 CREATE TABLE interval_year_to_month_table
(
	interval_year_col1 INTERVAL YEAR,
	interval_year_col2 INTERVAL MONTH,
 	interval_year_col3 INTERVAL YEAR TO MONTH
);

INSERT INTO interval_year_to_month_table(interval_year_col1) VALUES ( INTERVAL '12' YEAR);
INSERT INTO interval_year_to_month_table(interval_year_col2) VALUES ( INTERVAL '5' MONTH);
INSERT INTO interval_year_to_month_table(interval_year_col3) VALUES ( INTERVAL '1000-11' YEAR TO MONTH );
Copy
输出
Snowflake
 CREATE TABLE interval_year_to_month_table
(
	interval_year_col1 VARCHAR !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR DATA TYPE CONVERTED TO VARCHAR ***/!!!,
	interval_year_col2 VARCHAR !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL MONTH DATA TYPE CONVERTED TO VARCHAR ***/!!!,
	interval_year_col3 VARCHAR !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR TO MONTH DATA TYPE CONVERTED TO VARCHAR ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"redshift"}}'
;

INSERT INTO interval_year_to_month_table(interval_year_col1) VALUES ('12year, 0mons');

INSERT INTO interval_year_to_month_table(interval_year_col2) VALUES ('0year, 5mons');

INSERT INTO interval_year_to_month_table(interval_year_col3) VALUES ('1000year, 11mons');
Copy

Interval 值将转换为受支持的 Snowflake 格式,然后以文本形式插入到列中。由于 Snowflake 不支持 Interval 数据类型,因此仅在算术运算中支持这样做。若要使用该值,需要将其提取出来并用作 Interval 常量(如果可能的话)。

原始 Redshift 值: INTERVAL '1-2' YEAR TO MONTH

存储在 Snowflake 列中的值: '1y, 2m'

作为 Snowflake Interval 常量的值: INTERVAL '1y, 2m'

从“Interval Year To Month”列检索数据

输入
Redshift
 SELECT * FROM interval_year_to_month_table;
Copy
Result

interval_year_col1

interval_year_col2

interval_year_col2

12 years 0 mons

NULL

NULL

NULL

0 years 5 mons

NULL

NULL

NULL

1000 years 11 mons

输出
Snowflake
 SELECT * FROM
interval_year_to_month_table;
Copy
Result

interval_year_col1

interval_year_col2

interval_year_col2

12 y 0 mm

NULL

NULL

NULL

0 y 5 mm

NULL

NULL

NULL

1000 y 11 mons

已知问题

1.仅支持算术运算

Snowflake Interval 存在几项限制。仅支持 DATETIMESTAMPInterval 常量 之间的算术运算,不支持其他任何场景。

相关的 EWIs

  • SSC-EWI-0036:数据类型转换为另一种数据类型。

数字格式模型

描述

这些是 Redshift (https://docs.aws.amazon.com/redshift/latest/dg/r_Numeric_formating.html) 支持的不同数字格式,及其在 Snowflake 中的等效项。

Redshift

Snowflake

注释

0

0

9

9

.(句点)、D

.(句点)、D

,(逗号)

,(逗号)

CC

目前,Snowflake 中没有 Century Code 的等效项。

FM

FM

PR

目前,Snowflake 中没有此格式的等效格式。

S

S

显式数字符号。

L

$

货币符号占位符。

G

G

MI

MI

减号(表示负数)

PL

S

目前,Snowflake 中没有加号的等效符号。因此,它会被转换为显式数字符号。

SG

S

在指定位置使用显式数字符号。

RN

目前,Snowflake 中没有罗马数字的等效项。

TH

目前,Snowflake 中没有 Ordinal 后缀的等效项

示例源模式

在 To_Number 函数中的使用

输入:
Redshift
 select to_number('09423', '999999999') as multiple_nines
    , to_number('09423', '00000') as exact_zeros
    , to_number('123.456', '999D999') as decimals
    , to_number('123,031.30', 'FM999,999D999') as fill_mode
    , to_number('$ 12,454.88', '$999,999.99') as currency
;
Copy
Results
multiple_ninesexact_zerosdecimalsfill_modecurrency
94239423123.456123031.301254.88
输出
Snowflake
 select to_number('09423', '999999999') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''999999999'' NODE ***/!!! as multiple_nines
    , to_number('09423', '00000') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''00000'' NODE ***/!!! as exact_zeros
    , to_number('123.456', '999D999') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''999D999'' NODE ***/!!! as decimals
    , to_number('123,031.30', 'FM999,999D999') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''FM999,999D999'' NODE ***/!!! as fill_mode
    , to_number('$ 12,454.88', '$999,999.99') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''$999,999.99'' NODE ***/!!! as currency
;
Copy
Results
multiple_ninesexact_zerosdecimalsfill_modecurrency
94239423123.456123031.30012454.88
输入:
Redshift
 select to_number('$ 12,454.88', 'FML99G999D99') as currency_L
    , to_number('123-', '999S') as signed_number_end
    , to_number('+12454.88', 'PL99G999D99') as plus_sign
    , to_number('-12,454.88', 'MI99G999D99') as minus_sign
    , to_number('-12,454.88', 'SG99G999D99') as signed_number
;
Copy
Results
currency_Lsigned_number_endplus_signminus_signsigned_number
12454.8-1231254.88-12454.88-12454.88
输出:
Snowflake
 select to_number('$ 12,454.88', 'FML99G999D99') !!!RESOLVE EWI!!! /*** SSC-EWI-0006 - 'FML99G999D99' FORMAT MAY FAIL OR MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/!!! as currency_L
    , to_number('123-', '999S') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''999S'' NODE ***/!!! as signed_number_end
    , to_number('+12454.88', 'PL99G999D99') !!!RESOLVE EWI!!! /*** SSC-EWI-0006 - 'PL99G999D99' FORMAT MAY FAIL OR MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/!!! as plus_sign
    , to_number('-12,454.88', 'MI99G999D99') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''MI99G999D99'' NODE ***/!!! as minus_sign
    , to_number('-12,454.88', 'SG99G999D99') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''SG99G999D99'' NODE ***/!!! as signed_number
;
Copy
Results
currency_Lsigned_number_endplus_signminus_signsigned_number
12454.8-1231254.88-12454.88-12454.88

在 To_Char 函数中的使用

输入:
Redshift
 select to_char(-123, '999S') as signed_number
    , to_char(12454.88, 'FM99G999D99') as decimal_number
    , to_char(-12454.88, '99G999D99') as negative
    , to_char(-12454.88, 'MI99G999D99') as minus_sign
    , to_char(+12454.88, 'PL99G999D99') as plus_sign
    , to_char(09423, '999999999') as multiple_nines
    , to_char(09423, '00000') as exact_zeros
;
Copy
Results
signed_numberdecimal_numbernegativeminus_signplus_signmultiple_ninesmultiple_ninesexact_zerosexact_zeros
'123-''12,454.88''-12,454.88''12454.88''-12,454.88''09423''09423'
输出:
Snowflake
 select
    TO_CHAR(-123, '999S') as signed_number,
    TO_CHAR(12454.88, 'FM99G999D99') as decimal_number,
    TO_CHAR(-12454.88, '99G999D99') as negative,
    TO_CHAR(-12454.88, 'MI99G999D99') as minus_sign,
    TO_CHAR(+12454.88, 'S99G999D99') as plus_sign,
    TO_CHAR(09423, '999999999') as multiple_nines,
    TO_CHAR(09423, '00000') as exact_zeros
;
Copy
Results
signed_numberdecimal_numbernegativeminus_signplus_signmultiple_ninesmultiple_ninesexact_zerosexact_zeros
'123-''12,454.88''-12,454.88''12454.88''-12,454.88''09423''09423'

不支持的格式

不支持以下格式,为此将使用 EWI 对其进行标记。

输入:
 SELECT to_char(123031, 'th999,999')
Copy
输出:
 SELECT
TO_CHAR(123031, 'th999,999') !!!RESOLVE EWI!!! /*** SSC-EWI-0006 - th999,999 FORMAT MAY FAIL OR MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/!!!
Copy

已知问题

1. Using numeric signs inside the number not supported.

Snowflake 不支持在数字中间(而非数字开头或结尾)使用任何数字符号格式(MI、SG 或 PL)。

示例

 select to_number('12,-454.88', '99GMI999D99')
Copy

相关的 EWIs

  • SSC-EWI-0006: The current date/numeric format may have a different behavior in Snowflake.

语言: 中文