下面是ORACLE的描述TIMESTAMP WITH LOCAL TIME ZONE
...存储在数据库中的数据被规范化为数据库时区,并且时区偏移量不作为列数据的一部分存储。当用户检索数据时,Oracle在用户的本地会话时区中返回它。
将存储在数据库中的数据标准化为数据库时区意味着什么?标准化...如何?
如果它被规范化,为什么它不与服务器的时区而不是用户的本地会话时区相应地返回......它是如何“会话”而不是“服务器”?
下面是ORACLE的描述TIMESTAMP WITH LOCAL TIME ZONE
...存储在数据库中的数据被规范化为数据库时区,并且时区偏移量不作为列数据的一部分存储。当用户检索数据时,Oracle在用户的本地会话时区中返回它。
将存储在数据库中的数据标准化为数据库时区意味着什么?标准化...如何?
如果它被规范化,为什么它不与服务器的时区而不是用户的本地会话时区相应地返回......它是如何“会话”而不是“服务器”?
标准化意味着不存储时区信息。存储此类数据时,时间戳值会自动调整为与数据库服务器处于同一时区。检索此类数据时,时间戳值会自动调整为与客户端处于同一时区。
例如,我模拟我的客户在不同的时区:
创建一个表来存储时间戳值:
现在请注意我的本地(客户端)时间(
current_timestamp
)与服务器时间(systimestamp
)有何不同:现在我插入我的当地时间:
正是我所期望的。但如果我检查真正的内容:
TIMESTAMP
存储为:时区信息将在第 12 和第 13 个字节中,但它不与此数据类型一起存储。
所以实际存储的数据是
2016-12-29 15:36:32:...
,因为我的数据库在CET
时区。如果我假装在另一个不同的时区,我的查询将返回一个调整到该时区的时间戳:
很多时候,当您必须使用时区数据时,一种常见的方法是:
这正是
TIMESTAMP WITH LOCAL TIME ZONE
正在做的事情,但在 SQL 级别上。唯一的区别是:一旦您创建了一个带有
TIMESTAMP WITH LOCAL TIME ZONE
列的表,并且该表包含您无法再更改的任何数据DBTIMEZONE
- 当您考虑上述语句时,这听起来很合乎逻辑。