我在hsqldb表中有一个TIMESTAMP字段,我想将其设置为“2015-02-11 16:02:01.488 America / Los_Angeles”,但即使我将列设置为TIMESTAMP WITH TIMEZONE,插入也会失败,原因是hsqldb似乎支持'2008-08-08 20:08:08-8:00'格式,但没有像America / Los_Angeles那样拼写出来。有没有办法让插入接受America / Los_Angeles类型区域?
答案 0 :(得分:0)
抱歉,hsqldb不支持直接使用IANA/Olson time zones。您是正确的TIMESTAMP WITH TIMEZONE
仅支持时区偏移。您可以查看the hsqldb docs进行确认。
许多数据库不支持命名时区。 Oracle和Postgres支持他们,但其他大多数人都不支持。
同时考虑到,虽然命名时区通常确定偏移量,但在回退daylight saving time过渡期间仍然存在模糊不清的情况。换句话说,如果你有" 2015-11-01 01:30:00 America / Los_Angeles",你无法确定地判断它是太平洋夏令时(UTC-07:00)还是太平洋标准时间(UTC-08:00)。这就是为什么通常只存储偏移。
反过来也是如此。如果你只存储" -08:00"那么你无法确定地知道它来自" America / Los_Angeles"。
这是一个有用的一般准则:
如果当地时间不重要,则只需存储基于UTC的TIMESTAMP
。
如果当地时间很重要,但永远不会修改该值,则使用当地时间及其相关的时区偏移量存储TIMESTAMP WITH TIMEZONE
。
如果当地时间很重要并且可以修改该值,则将TIMESTAMP WITH TIMEZONE
存储在一列中,然后存储时区名称(即" America / Los_Angeles")在第二个VARCHAR
列或数据库的其他位置。在编辑操作期间,使用时区名称计算新值的偏移量。它可能是相同的,也可能是不同的。
另请参阅DateTime vs DateTimeOffset,它为.Net和/或SQL Server提供了类似的参数。