关于"timestamp with time zone"

SQL标准好像没有明确说附加的TIME ZONE要不要作为一个值存下来,具体到不同数据库,对TIMESTAMP WITH TIME ZONE的实现还是有差异的。

Oracle

Oracle的功能最完善,Oracle有3种TIMESTAMP类型,分别是
TIMESTAMP
  无时区概念,存什么时间(年月日时分秒)进去取出来就是什么时间。
TIMESTAMP WITH LOCAL TIME ZONE
  按database timezone存储时间,取数据时按用户session的时区时间返回给用户,取出来的时间是不带时区的。
  Oracle建议把database timezone设置为标准时间UTC,这样可以节省每次转换所需要的开销,提高性能。
TIMESTAMP WITH TIME ZONE
  时间和时区都被存下来,取数据时能获得当初存储的时间和时区。

SQL Server

SQL Server有个奇葩的地方,就是它的“timestamp”其实不是时间日期类型,而是行版本。SQL Server中和SQL标准的TIMESTAMP对应是下面的数据类型:
datetime/datetime2
  对应于SQL标准TIMESTAMP
datetimeoffset
  SQL Server2008新加的数据类型,是时间+时区偏移量的组合,相当于SQL标准TIMESTAMP WITH TIME ZONE。

PostgreSQL

PostgreSQL也有奇葩的地方,它的“TIMESTAMP WITH TIME ZONE”从名字上很容易给人不该有的期望。
TIMESTAMP
  对应于SQL标准TIMESTAMP
TIMESTAMP WITH TIME ZONE
  内部是按UTC时区存储的时间,客户端读写该数据时PostgreSQL服务器根据用户session的timezone和UTC的差距进行时间转换。由于并没有把原始的时区值存下来,所以PostgreSQL的“TIMESTAMP WITH TIME ZONE”其实相当于Oracle的“TIMESTAMP WITH LOCAL TIME ZONE”。但是PostgreSQL中名称类似的“TIME WITH TIME ZONE”数据里却是存储了时区值的。所以如果确实需要得到原始的时区可以定义一个(date,timetz)的组合类型。


关于PostgreSQL的“TIMESTAMP WITH TIME ZONE”,今年PG社区有个讨论,原来“TIMESTAMP WITH TIME ZONE”是从以前的一个数据类型改名改过来的,并且现在看来改的不太理想。

参考:

http://www.postgresql.org/docs/9.4/static/datatype-datetime.html
http://msdn.microsoft.com/zh-cn/library/bb630289.aspx
http://blog.itpub.net/28502651/viewspace-766329/

 

转载自:http://blog.chinaunix.net/uid-20726500-id-4718611.html(转载时有删减)

posted @ 2017-07-12 14:54  icuke  阅读(4073)  评论(0)    收藏  举报