[20150708]关于时区的问题.txt

[20150708]关于时区的问题.txt

--昨天被一个时区的问题搞糊涂了。

SELECT *
  FROM (  SELECT log_date
                ,owner
                ,job_name
                ,status
                ,req_start_date
            FROM DBA_SCHEDULER_JOB_RUN_DETAILS
           WHERE job_name LIKE 'PURGE_LOG'
        ORDER BY 1 DESC)
WHERE ROWNUM

LOG_DATE                    OWNER  JOB_NAME   STATUS    REQ_START_DATE              RUN_DURATION
--------------------------- ------ ---------- --------- --------------------------- --------------
2015-07-07 18:00:01.320954  SYS    PURGE_LOG  SUCCEEDED 2015-07-07 03:00:00.400000  +000 00:00:01
2015-07-06 18:00:01.102518  SYS    PURGE_LOG  SUCCEEDED 2015-07-06 03:00:00.300000  +000 00:00:01
 
--什么会相差什么大呢?LOG_DATE,REQ_START_DATE。
SELECT *
  FROM (  SELECT log_date
                ,owner
                ,job_name
                ,status
                ,req_start_date
                ,run_duration
                ,log_date - req_start_date
            FROM DBA_SCHEDULER_JOB_RUN_DETAILS
           WHERE job_name LIKE 'PURGE_LOG'
        ORDER BY 1 DESC)
WHERE ROWNUM

LOG_DATE                    OWNER  JOB_NAME   STATUS     REQ_START_DATE              RUN_DURATION  LOG_DATE-REQ_START_DATE
--------------------------- ------ ---------- ---------- --------------------------- ------------- --------------------------
2015-07-07 18:00:01.320954  SYS    PURGE_LOG  SUCCEEDED  2015-07-07 03:00:00.400000  +000 00:00:01 +000000000 00:00:00.920954
2015-07-06 18:00:01.102518  SYS    PURGE_LOG  SUCCEEDED  2015-07-06 03:00:00.300000  +000 00:00:01 +000000000 00:00:00.802518

--LOG_DATE-REQ_START_DATE 很小的。

@desc DBA_SCHEDULER_JOB_RUN_DETAILS
--发现这个类型TIMESTAMP(6) WITH TIME ZONE。

--在toad下查看发现,显示的时间是:2015/7/7 18:00:01.320954 +08:00,2015/7/7 3:00:00.400000 -07:00。
--看来是时区的问题。

$ echo $NLS_TIMESTAMP_TZ_FORMAT
YYYY-MM-DD HH24:MI:SS.FF
$ export NLS_TIMESTAMP_TZ_FORMAT=

LOG_DATE                             OWNER  JOB_NAME   STATUS     REQ_START_DATE                           RUN_DURATION         LOG_DATE-REQ_START_DATE
------------------------------------ ------ ---------- ---------- ---------------------------------------- -------------------- --------------------------
07-JUL-15 06.00.01.320954 PM +08:00  SYS    PURGE_LOG  SUCCEEDED  07-JUL-15 03.00.00.400000 AM PST8PDT     +000 00:00:01        +000000000 00:00:00.920954
06-JUL-15 06.00.01.102518 PM +08:00  SYS    PURGE_LOG  SUCCEEDED  06-JUL-15 03.00.00.300000 AM PST8PDT     +000 00:00:01        +000000000 00:00:00.802518

--看来不能定义NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SS.FF'。这样很容易存在歧义性。

SCOTT@test> select * from NLS_DATABASE_PARAMETERS where parameter='NLS_TIMESTAMP_TZ_FORMAT';
PARAMETER                      VALUE
------------------------------ ----------------------------
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR

$ export NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SS.FF TZR'

SCOTT@test> /
LOG_DATE                           OWNER  JOB_NAME   STATUS     REQ_START_DATE                           RUN_DURATION         LOG_DATE-REQ_START_DATE
---------------------------------- ------ ---------- ---------- ---------------------------------------- -------------------- --------------------------------
2015-07-07 18:00:01.320954 +08:00  SYS    PURGE_LOG  SUCCEEDED  2015-07-07 03:00:00.400000 PST8PDT       +000 00:00:01        +000000000 00:00:00.920954
2015-07-06 18:00:01.102518 +08:00  SYS    PURGE_LOG  SUCCEEDED  2015-07-06 03:00:00.300000 PST8PDT       +000 00:00:01        +000000000 00:00:00.802518

--奇怪toad下能显示-07:00,而我这里仅仅显示PST8PDT,如果显示数字呢?google发现定义如下:

$ export NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SS.FF TZH:TZM'

SCOTT@test> /
LOG_DATE                                 OWNER  JOB_NAME   STATUS     REQ_START_DATE                           RUN_DURATION         LOG_DATE-REQ_START_DATE
---------------------------------------- ------ ---------- ---------- ---------------------------------------- -------------------- ---------------------------
2015-07-07 18:00:01.320954 +08:00        SYS    PURGE_LOG  SUCCEEDED  2015-07-07 03:00:00.400000 -07:00        +000 00:00:01        +000000000 00:00:00.920954
2015-07-06 18:00:01.102518 +08:00        SYS    PURGE_LOG  SUCCEEDED  2015-07-06 03:00:00.300000 -07:00        +000 00:00:01        +000000000 00:00:00.802518

--剩下的问题是如何看2015-07-07 18:00:01.320954 +08:00,2015-07-07 03:00:00.400000 -07:00是差不多一致的时间。

SCOTT@test> alter session set time_zone = '+0:00';
Session altered.

SCOTT@test> select systimestamp,current_timestamp from v$database ;
SYSTIMESTAMP                       CURRENT_TIMESTAMP
---------------------------------- ----------------------------------
2015-07-08 11:20:27.070505 +08:00  2015-07-08 03:20:27.070513 +00:00

--如果时间取格林尼治时间时区是+0:00,使用当前时间-减去8小时。相对8时区的情况。(哎,小学生的数学都忘记了)。

--这样上面2015-07-07 18:00:01.320954 +08:00 (减小8小时)= 2015-07-07 10:00:01.320954 +00:00(格林尼治时间)
          2015-07-07 03:00:00.400000 -07:00 (加上7小时)= 2015-07-07 10:00:00.400000 +00:00(格林尼治时间)

--这样就差不多了,补充1点小常识:

PST8PDT是什么时区?

PST-Pacific Standard Time太平洋标准时间[加拿大及美国太平洋标准时间.PST是美国西部城市通用的标准时间,以旧金山的时间为准.
PDT太平洋夏季时间.美国西海岸(旧金山 洛杉矶西雅图波特兰)在夏时制时用这一时间. 夏时制结束后就是PST.
以UTC(Coordinated Universal Time 国际协调时间)为准:PST为UTC-8,即比UTC慢8个小时;

PDT
PDT 是 Pacific Daylight Time 的缩写,译为中文为"太平洋夏令时间",比 UTC 时间晚 7 小时。

其实除了 PDT 时间,北美地区还有很多时间:

美国夏季始于每年4月的第1个周日,止于每年10月的最后一个周日。夏令时比正常时间早一小时,与PDT时间相对应的是PST , Pacific
Standard Time 。 夏时制结束后就是PST

时间: 2024-07-30 10:56:44

[20150708]关于时区的问题.txt的相关文章

[20170825]2038.txt

[20170825]2038.txt --//昨天帮别人解决电脑问题联想到的,对方是主机电池没电,导致启动XP黑屏,重新设置正确的时间后ok. --//这样我想到除了2000年外的2038年的问题,大家知道类unix的os系统计时从'1970/1/1'开始的秒数. --//因为符号整形最大是2^31-1=2147483647秒. SYS@book> select to_date('1970/1/1','yyyy-mm-dd') + 2147483647/86400 from dual ; TO_

[20121203]windows下使用systeminfo查看本机信息.txt

[20121203]windows下使用systeminfo查看本机信息.txt 前几天看别人使用systeminfo命令查看本机信息,感觉显示很多,在自己的机器上做一个测试以及学习看看. d:\tools>systeminfo /? SYSTEMINFO [/S system [/U username [/P [password]]]] [/FO format] [/NH] 描述:    该工具显示本地或远程机器(包括服务包级别)的操作系统配置的信息. 参数列表:    /S      sys

【故障处理】ORA-01882: 未找到时区区域 %s

和许多网友一样,今天遇到了ora-01882问题,查了matelink解决了! 环境:Oracle server端版本: SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi PL/SQL Release 10.2.0.

php时区转换函数

 godaddy主机在国外.把站点建站国外,显示时间时可能需要时区转换,下面是个方便的工具函数,用于时区转换 代码如下: /*  * 时区转换  */   function toTimeZone($src, $from_tz = 'America/Denver', $to_tz = 'Asia/Shanghai', $fm = 'Y-m-d H:i:s') {     $datetime = new DateTime($src, new DateTimeZone($from_tz));    

wince下,使用C# ,把数据写入txt文件中

问题描述 wince下,使用C# ,把数据写入txt文件中 各位高手大家好,我在wince下,使用C# ,把数据写入txt文件中,所有的代码都执行完成,也没有发生任何错误,但是我打开txt里面是空白的,没有任何数据,不知其解,望高手不吝指教,谢谢.写入txt的代码如下: FileStream fs = null; StreamWriter sw = null; try { fs = new FileStream(fileName, FileMode.Append, FileAccess.Writ

教你快速将多个TXT文档合并成一个

网上下载的文件常常会分割成好几个文件,阅读起来非常不便,本教程为大家介绍如何快速将多个txt文件合并. 文档合并成一个-快速合并word文档"> 同时选定需要合并的txt文档进行压缩 步骤1:首先选中需要合并的多个TXT文档,然后单击鼠标右键,在弹出的菜单中选中"Win-RAR-添加到压缩文件"命令,这时会出现"压缩文件名和参数"窗口,在"常规"标签页中对压缩文件进行命名,并将"压缩方式"下拉框中的"

txt文件-c++如何控制文件输出的行数?

问题描述 c++如何控制文件输出的行数? 我有一个几千行的txt文件,里面都是ascall字符,我想每次读取30行在控制台显示然后清屏,延迟0.1s后再输出接下来的30行,也就是第一次控制台输出1-30行,清屏,第二次输出31-60行,这样一直下去,直到文件末尾 1. 我希望在每次在控制台显示的时候一次性显示30行的字符,必须一次性显示30行,肉眼不能察觉到是一行一行显示出来的. 解决方案 自己做个计数就好了,30行后,计数清零,重新计数 解决方案二: #include #include #in

如何在java中实现读取一个txt文档中的随机一行

问题描述 如何在java中实现读取一个txt文档中的随机一行 如题,如何在java中实现读取一个txt文档中的随机一行? 主要就是怎么随机读取 解决方案 根据楼上的说法,来总结一下吧,总体来说,就是将文件全部都读取出来,每一行存储到一个数组或集合中,然后再通过产生随机数,来对这个数组或是 集合进行随机的访问.这样一来就解决了 解决方案二: 文本文件只能顺序读,不能随机读.你的需求只能是读取文本文件每一行到一个arraylist,然后得到下标范围,产生一个随机数,取那一行 解决方案三: http:

Word文档批量转换成TXT格式的技巧

使用Word编辑文档的时候,不仅可以保存成Word格式,也可以保存为其它格式.但有的时候需要将大批的已经编辑完成的Word文档转换成文本格式或其他格式文档,怎么办?如果通过"另存为"将是一件十分费时费力的事情. 可能有人说了利用第三方工具软件吧,那是另一话题.在这里笔者要告诉大家的是:批量转换文档格式不求"人",完全可以借助Word本身自带的功能就可以完成批量转换文档格式的工作.为了叙述方便,专家以将Word文档格式批量转换成TXT文本格式为例来介绍其转换过程,具体