避免在 Redshift 上仅向日期时间字段提供时间时使用默认日期值

Posted

技术标签:

【中文标题】避免在 Redshift 上仅向日期时间字段提供时间时使用默认日期值【英文标题】:Avoiding default date value to be used when only time is provided to a datetime field on Redshift 【发布时间】:2014-01-17 08:04:29 【问题描述】:

我创建了一个带有日期时间字段“dt”的表。使用 COPY 命令加载数据。文件中字段的对应值只是小时信息,例如,14:50:00。因此,存储的值是 1900-01-01 14:50:00。我不需要日期部分。怎么做。

或者可能是只能存储时间的替代数据类型。

【问题讨论】:

忽略日期部分有那么难吗? 并不难。问题是正在为客户构建它。因此,我没有向它提供处理该字段的说明,而是在寻找最佳解决方案。 【参考方案1】:

Amazon Redshift 仅支持日期(年月日)和时间戳(年月日时分秒)格式,不支持 Postgresql 的时间(时分秒)格式。

在我的想法中,有两种解决方法。

正如@Damien_The_Unbeliever 提到的,忽略时间戳格式的日期部分。
create table date_test(id int, timestamp timestamp);
insert into date_test2 values (1, '1900-01-01 14:50:00');
insert into date_test2 values (2, '1900-01-01 17:20:00'); 
select * from date_test2 where timestamp > '1900-01-01 14:50:00'; 
select * from date_test where date_test.timestamp > '1900-01-01 14:50:00';
 id |      timestamp
----+---------------------
  2 | 1900-01-01 17:20:00
(1 row) 
使用char或varchar类型存储时间值。
create table date_test2(id int, timestamp char(8));
insert into date_test2 values (1, '14:50:00');
insert into date_test2 values (2, '17:20:00');
select * from date_test2 where timestamp > '14:50:00';
 id | timestamp
----+-----------
  2 | 17:20:00
(1 row) 

第二种解决方案看起来更容易,但正如 Redshift 文档所说,它的性能更差。如果你存储大量数据,你应该考虑第一个。

这里是有关日期/时间列的文档的相关链接。

http://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-timestamp-date-columns.html http://docs.aws.amazon.com/redshift/latest/dg/r_Datetime_types.html

【讨论】:

我使用了第二种方法,因为第一个解决方案必须指示客户处理日期。听起来很可怜​​。

以上是关于避免在 Redshift 上仅向日期时间字段提供时间时使用默认日期值的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Amazon Redshift 中将时间戳转换为日期

从 AWS Glue 表到 RedShift Spectrum 外部表的日期字段转换

如何在 Redshift 中结合演员表和日期最大值?

[SymmetricDS]:来自源的多行仅向目标写入一行

仅向视频管道提供音频时,Gstreamer 管道卡在预滚动状态

需要从redshift中的日期列中划分月份和年份