暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关于timestamp with local time zone

数据和云 2017-09-19
1368


作者介绍

崔华   网名 dbsnake

Oracle ACE Director,ACOUG 核心专家



思考
Oracle数据迁移时源库和目标库的时区不一样,这对于迁移数据而言是否有影响?



答:这个是没有影响的。

Oracle里跟时区有关的数据类型有哪些?


答:总共有两种,分别是timestamp with time zonetimestamp with local time zone,Oracle分别用13个byte和11个byte来存储他们。

这里面timestamp with time zone没什么好说的,因为里面的时区是用2个byte来固定的存储时区的偏移量,所以源库和目标库的时区即使不一样,对原始数据也没有影响。

timestamp with local time zone跟timestamp with time zone最大的区别


答:timestamp with local time zone不会具体存储时区的偏移量,而是会根据dbtimezone和用户插入数据时指定的时区(通常就等于sessiontimezone)之间的差值来调整所存储的时间:

实例验证


我们来看一个实例:


数据库1



现在这个库的systimestamp中包含的时区和dbtimezone相同,所以当我插入systimestamp的时候,Oracle 不会对timestamp with local time zone做时间上的调整:



从结果里我们看到,17减1后是16,也就是下午4点,所以这里是没有发生时间的调整的,原因我上面已经说过了。


我们修改一下sessiontimezone后再插入一条记录,我把sessiontimezone修改为洛杉矶所在的时区:



注意,这个时候不能再插入systimestamp了,systimestamp跟sessiontimezone和dbtimezone没有关系,它只取决于database server端环境变量TZ的设置



从结果里我们可以看到,之前插入的那条记录显示结果变成了2月1日上午零点18分,这是正常的,因为timestamp with local time zone的显示结果会随着sessiontimezone的改变而改变,洛杉矶滞后于北京16个小时,所以我们在16点18分插入的那条记录的显示结果变成了上午零点18分。


现在我们来解释刚刚插入的第二条记录的显示结果:

插入的时候我们指定了是以洛杉矶当地时间16点38分19秒,而现在的sessiontimezone就是洛杉矶所在的时区,所以第二条记录的显示结果就是16点38分19秒。

现在第二条记录Oracle实际上的存储结果是120,112,2,2,9,39,20,这里因为dbtimezone是+08:00,插入的时候我们指定了是以洛杉矶当地时间(相当于sessiontimezone是-08:00),所以Oracle要对timestamp with local time zone实际存储结果加上sessiontimezone和dbtimezone的差值,也就是16个小时。16点38分19秒加上16是32点38分19秒,也就是第二天早上8点38分19秒,所以这里Oracle实际的存储结果变成了2,2,9,39,20。


我们导出上述表:



现在我们切换到目标数据库2,这个库里dbtimezone和数据库1的dbtimezone是不一样的,这里我用dbtimezone的差异来模拟时区的差异:


数据库2:



我们尝试导入刚才在数据库1里导出的表t2:



现在我们来看一下导入的结果:



现在我们再次回到数据库1并将sessiontimezone设成和数据库2一样:


数据库1:




可以看到两条记录的显示时间是一致的,所以对于timestamp with local time zone而言,数据迁移时不同的时区是没有关系的。


结论


这里数据库1的dbtimezone是+08:00,数据库2的dbtimezone是+00:00,所以Oracle对原来的第一条记录的小时17减了8变成了9,第二条记录的小时9减了8变成1。

其本质原因是Oracle在做数据迁移时,对timestamp with local time zone类型的数据Oracle会根据源库和目标库不同的dbtimezone来对timestamp with local time zone类型的数据做转换。


分享

【线上分享 第47期】Hive 中利用正则表达式    

恩墨大数据讲堂每周三八点与您相约。恩墨大讲堂邀请恩墨学院大数据产品总监孟硕老师,为你讲述Hive 中利用正则表达式 。主要为您阐述:


1、 正则表达式定义2、 正则表达式函数3、 正则解析器4、使用正则解析器生成表


参与方式:扫描下图的二维码。


文章转载自数据和云,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论