红移时间数据类型

Posted

技术标签:

【中文标题】红移时间数据类型【英文标题】:Redshift Time Datatype 【发布时间】:2020-08-31 08:47:53 【问题描述】:

我正在尝试创建和加载与其他数据库不同的 TIME 列来存储,只是时间。即 09:30:00、14:23:16 根据这个https://docs.aws.amazon.com/redshift/latest/dg/r_Datetime_types.html Redshift 有一个 TIME 数据类型。 然而,尝试像日期和时间戳数据类型一样使用它被证明具有挑战性。

select version();
                                                          version                                                          
---------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.18228
(1 row)

-- TimeStamps ------------------------------------------------------------------------
drop table if exists t1;
psql:redshiftTime.sql:4: INFO:  Table "t1" does not exist and will be skipped
DROP TABLE
create table t1 (c1 timestamp);
CREATE TABLE
insert into t1 (select current_timestamp);
INSERT 0 1
insert into t1 values ('2020-03-01 07:30:57.123456');
INSERT 0 1
insert into t1 values ('2020-03-01 07:30:57');
INSERT 0 1

-- Dates -----------------------------------------------------------------------------
drop table if exists t1;
DROP TABLE
create table t1 (c1 date);
CREATE TABLE
insert into t1 (select current_date);
INSERT 0 1
insert into t1 values ('2020-03-01');
INSERT 0 1


-- Times -----------------------------------------------------------------------------
drop table if exists t1;
DROP TABLE
create table t1 (c1 time);   -- FAILS????
psql:redshiftTime.sql:19: ERROR:  Column "t1.c1" has unsupported type "time without time zone".
insert into t1 (select current_time);  
psql:redshiftTime.sql:20: ERROR:  relation "t1" does not exist
insert into t1 values ('12:00:00'); 
psql:redshiftTime.sql:21: ERROR:  relation "t1" does not exist
-- CHAR Woraround ???? ----------------------------------------------------------------
drop table if exists t1;
psql:redshiftTime.sql:25: INFO:  Table "t1" does not exist and will be skipped
DROP TABLE
create table t1 (c1 CHAR(8));
CREATE TABLE
insert into t1 (select current_time);   -- FAILS  - expected due to mismatch data type
psql:redshiftTime.sql:27: INFO:  Function "text(time with time zone)" not supported.
psql:redshiftTime.sql:27: INFO:  Function "timetz(time with time zone,integer)" not supported.
psql:redshiftTime.sql:27: ERROR:  Specified types or functions (one per INFO message) not supported on Redshift tables.
insert into t1 values ('12:00:00'); -- OK
INSERT 0 1
SELECT CAST( current_time AS CHAR(8)); -- OK - automagic substring
  bpchar  
----------
 08:42:24
(1 row)

insert into t1 (SELECT CAST( current_time AS CHAR(8))); -- FAILS
psql:redshiftTime.sql:31: INFO:  Function "text(time with time zone)" not supported.
psql:redshiftTime.sql:31: INFO:  Function "timetz(time with time zone,integer)" not supported.
psql:redshiftTime.sql:31: ERROR:  Specified types or functions (one per INFO message) not supported on Redshift tables.
SELECT CAST( current_time AS CHAR(18)); -- OK 
       bpchar       
--------------------
 08:42:25.411191+00
(1 row)

insert into t1 (SELECT substr(CAST( current_time AS CHAR(18)),1,8)); -- FAILS
psql:redshiftTime.sql:34: INFO:  Function "text(time with time zone)" not supported.
psql:redshiftTime.sql:34: INFO:  Function "timetz(time with time zone,integer)" not supported.
psql:redshiftTime.sql:34: ERROR:  Specified types or functions (one per INFO message) not supported on Redshift tables.

【问题讨论】:

【参考方案1】:

我的测试与您的发现相符。

但是,虽然我无法创建 TIME 类型的列,但我可以转换为 TIME:

SELECT NOW()::TIME

09:10:08

但是,我无法将 TIMESTAMP 表列转换为 TIME。最奇怪的!

【讨论】:

以上是关于红移时间数据类型的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 psycopg2 从亚马逊红移读取列类型

红移中的 juliandate 到 normaldate

从计算操作访问领导节点类型

如何为红移中字符串的唯一计数百分比?

红移连接的粘合作业:“无法找到合适的安全组”

在红移中评估的顺序是啥