避免在 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 外部表的日期字段转换