【问题标题】:Update timezone columns in a Postgres DB更新 Postgres 数据库中的时区列
【发布时间】:2013-12-09 13:51:26
【问题描述】:

我已经开始使用timestamp without timezone 创建产品数据库。然后,意识到我的错误,我开始使用timestamp with timezone。现在我想把它统一到后者。

问题:是否可以在已经包含数据的现有 Postgres 8.4 DB 中将所有类型为时间戳的列没有 TZ 转换为 TZ?

最好的解决方案是在一次执行中执行此操作的脚本(当然)。即使是一次修复单个列的脚本也会很棒。问题是,在输出中使用它的一些现有视图上,天真的 ALTERing 列失败(尽管我不明白为什么在这种情况下它不好 - 它只是稍微扩大了输出类型)。

【问题讨论】:

    标签: postgresql timezone timestamp


    【解决方案1】:

    您想要ALTER TABLE ... ALTER COLUMN ... TYPE ... USING (...),它可以满足您的期望。您需要确定这些时间所在的时区,并为您的 USING 子句提供合适的 AT TIME ZONE 表达式。

    这些将ALTERs 将重写每个表,所以允许这样做。之后你可能想CLUSTER他们。

    但是,您似乎认为这两种类型是可以互换的。他们不是。这就是为什么您需要删除并重建您的视图。此外,您还需要适当地重写任何应用程序。

    如果您看不出它们有何不同,请泡上一杯热茶或咖啡,坐下来阅读手册中的时间和日期部分,然后花一个小时左右的时间仔细阅读它们。也许这里也有一些问答。这不一定是微小的变化。我会特别警惕您决定适用的任何时区的任何夏令时/夏季班次。

    【讨论】:

    • 谢谢,我会尽快尝试。无论如何,我当前的带有 TZ 的时间戳只有一个恒定的 TZ(如果我算上夏令时,那就是 2),所以旧时间戳的升级非常简单。这就是我现在修复它的原因,以免为时已晚:)
    • 最后我使用脚本找到了所有类型不正确的列,然后在回滚事务中尝试了 ALTER TABLE...ALTER COLUMN 以查找所有依赖对象 - 这是几个意见。最终我准备了一个脚本来删除这些视图,更新列类型并重新创建视图......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2018-02-09
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多