【问题标题】:'Column is of type timestamp without time zone but expression is of type interval' Redshift'列是没有时区的时间戳类型,但表达式是间隔类型' Redshift
【发布时间】:2020-02-17 18:39:19
【问题描述】:

我有一列时区名称。我想获得与 UTC 时间相比时差的另一列。但是我不知道在创建表时我应该为这个偏移列使用哪种数据类型。我用过:

CREATE TABLE zone_offset(
zone_name varchar(50),
zone_utc_diff timestamp
);

INSERT INTO zone_offset

SELECT zone_name, getdate() - getdate() at time zone zone_name AS zone_utc_diff
FROM zones

我得到了那个错误。我怎样才能使它适用于任何数据类型?

非常感谢您!

【问题讨论】:

  • 您可能应该将zone_utc_diff 存储为间隔,而不是时间戳。时间戳代表日期/时间,而间隔代表日期之间的差异。
  • 我尝试了间隔。但是没有区间数据类型。

标签: sql amazon-redshift


【解决方案1】:

您可能应该将 zone_utc_diff 存储为间隔,而不是时间戳。时间戳代表日期/时间,而间隔代表日期之间的差异。

Demo on DB Fiddle

create table zones (
    zone_name varchar(50)  
);    

insert into zones values('cet');

create table zone_offset(
    zone_name varchar(50),
    zone_utc_diff interval
);

insert into zone_offset
select zone_name, current_timestamp - (current_timestamp at time zone zone_name) as zone_utc_diff
from zones


select * from zone_offset;

| zone_name | zone_utc_diff   |
| --------- | --------------- |
| cet       | {"hours":-1}    |

【讨论】:

  • 谢谢!我发现另一个解决方案是使用 EXTRACT(从 getdate() 开始的小时 - 在时区 zone_name 的 getdate()),它返回整数
  • @YinghioYang:如果时区差异包括分钟(有些是这样),这将是不准确的。间隔是表示日期差异的正确方式:这就是它们的设计目的。
  • redshift建表时没有数据类型'interval'...
猜你喜欢
  • 2021-06-18
  • 2023-03-14
  • 2015-11-09
  • 2015-11-26
  • 2019-11-08
  • 2021-12-27
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多