关于"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(转载时有删减)