我们有一张表,其中填充着来自另一个系统的旧报告数据。该表的列反映了报告的相同结构。
以下是表的简化结构:
我们正在重构这个表格以处理不同客户的不同时区。新结构可能如下所示:
这些时间字段代表了 REPORT_DATE 列所代表的一天中的特定时间点。我的意思是,每个 TIME 列都代表在 REPORT_DATE 指定的一天中的某个时刻。
还有其他几点需要考虑:
- 我们不知道为什么我们从旧系统接收到的 START_HOUR 是 TIMESTAMP 格式。但是我们会按照原样导入数据。 - 报告中的字段根据客户端的时区进行格式化,因此为了重构此表,我们需要将客户端的时区(我们有这些信息)与 UTC 正确地插入时间戳/时间。 但现在问题来了。这些列的值被用于多次计算我们系统中的其他值,类似于以下内容:
经过一些研究,我发现不推荐使用类型
此外,我已经知道安全地减去两个
至于表格重构,我们应该仍然使用
我认为这些问题是相关的,因为我们选择使用的新列类型将定义我们如何操作列。
以下是表的简化结构:
CREATE TABLE IF NOT EXISTS LEGACY_TABLE (
REPORT_DATE DATE NOT NULL,
EVENT_ID BIGINT PRIMARY KEY NOT NULL,
START_HOUR TIMESTAMP WITHOUT TIME ZONE,
END_HOUR TIME WITHOUT TIME ZONE,
EXPECTED_HOUR TIME WITHOUT TIME ZONE
);
我们正在重构这个表格以处理不同客户的不同时区。新结构可能如下所示:
CREATE TABLE IF NOT EXISTS LEGACY_TABLE (
REPORT_DATE DATE NOT NULL,
EVENT_ID BIGINT PRIMARY KEY NOT NULL,
START_HOUR TIMESTAMP WITH TIME ZONE,
END_HOUR TIME WITH TIME ZONE,
EXPECTED_HOUR TIME WITH TIME ZONE
);
这些时间字段代表了 REPORT_DATE 列所代表的一天中的特定时间点。我的意思是,每个 TIME 列都代表在 REPORT_DATE 指定的一天中的某个时刻。
还有其他几点需要考虑:
- 我们不知道为什么我们从旧系统接收到的 START_HOUR 是 TIMESTAMP 格式。但是我们会按照原样导入数据。 - 报告中的字段根据客户端的时区进行格式化,因此为了重构此表,我们需要将客户端的时区(我们有这些信息)与 UTC 正确地插入时间戳/时间。 但现在问题来了。这些列的值被用于多次计算我们系统中的其他值,类似于以下内容:
START_HOUR - END_HOUR (the result of this operation is currently being casted to TIME WITHOUT TIME ZONE)
START_HOUR < END_HOUR
START_HOUR + EXPECTED_HOUR
EXPECTED_HOUR - END_HOUR
EXPECTED_HOUR < '05:00'
经过一些研究,我发现不推荐使用类型
TIME WITH TIME ZONE
(Postgres time with time zone equality),现在我有点困惑,关于重构处理不同时区和处理我们需要的不同列操作,最好的方法是什么。此外,我已经知道安全地减去两个
TIMESTAMP WITH TIME ZONE
类型的列。这个减法操作考虑了DST的变化(Subtracting two columns of type timestamp with time zone),但其他情况呢?如果从一个时间戳中减去一个时间呢?至于表格重构,我们应该仍然使用
TIME WITHOUT TIME ZONE
吗?还是更好地忘记TIME
类型,将日期与时间组合,并将列更改为TIMESTAMP WITH TIME ZONE
?我认为这些问题是相关的,因为我们选择使用的新列类型将定义我们如何操作列。
START_HOUR
的日期部分吗?或者您是否有一个CHECK
约束来确保它与REPORT_DATE
相同? - Erwin BrandstetterREPORT_DATE
是相同的。 - Luiz