[20170309]关于v$archived_log.stamp字段

[20170309]关于v$archived_log.stamp字段.txt

--//如果你查询v$archived_log,可以看到一个stamp字段,它表示什么呢?根据以前的经验.这个类似从某个时间点计算的秒数.
--//参考链接:
http://blog.itpub.net/267265/viewspace-1979123/
--曾经探究过V$RMAN_OUTPUT 视图,STAMP 是从时间"1987-06-26 00:00:00"开始的.

--//简单探究这个v$archived_log.stamp从那个时间开始的.

1.环境:
select * from v$version;

BANNER                                                         
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production                         
CORE    10.2.0.4.0    Production                                     
TNS for Linux: Version 10.2.0.4.0 - Production                 
NLSRTL Version 10.2.0.4.0 - Production        
--//我的测试库归档太少,找一个10g的归档很多的数据库测试.

2.利用v$archived_log的next_time可以简单判断:

--//dest_id=1是本地归档,一般闪回区或者磁盘充足的,归档马上发生.

SELECT stamp
        ,sequence#
        ,first_time
        ,NEXT_TIME
        ,NEXT_TIME - stamp / 86400 begin_time
    FROM v$archived_log
   WHERE dest_id = 1 AND name IS NOT NULL
ORDER BY 1 DESC;

--//发现很奇怪的现象,NEXT_TIME - stamp / 86400范围在1987/6/17-1987/6/20.起点应该一致的.很明显不是这样运算的.

--//想起http://www.juliandyke.com/Diagnostics/Dumps/RedoLogs.php转储redo时time参数使用:

TIME

The minimum and maximum time is a decimal number representing the number of seconds since midnight 01Jan1988. These are
calculated using the following formula:

time = (((((yyyy - 1988) * 12 + mm - 1) * 31 + dd - 1) * 24 + hh) * 60 + mi) * 60 + ss;

/* Formatted on 2017/3/9 17:19:44 (QP5 v5.269.14213.34769) */
SELECT stamp, js, stamp - js
  FROM (SELECT stamp
              ,(((((yyyy - 1988) * 12 + mm - 1) * 31 + dd - 1) * 24 + hh) * 60 + mi) * 60 + ss js 
          FROM (SELECT stamp
                      ,sequence#
                      ,first_time
                      ,NEXT_TIME
                      ,TO_CHAR (next_time, 'yyyy') yyyy
                      ,TO_CHAR (next_time, 'mm') mm
                      ,TO_CHAR (next_time, 'dd') dd
                      ,TO_CHAR (next_time, 'hh24') hh
                      ,TO_CHAR (next_time, 'mi') mi
                      ,TO_CHAR (next_time, 'ss') ss
                  FROM v$archived_log
                 WHERE dest_id = 1 AND name IS NOT NULL));

--//这样stamp-js相差最大也是5,比较接近,这样以前我的http://blog.itpub.net/267265/viewspace-1979123/算法存在错误,应该都是
--//按照上面的公式计算的.感觉这样反过来算时间就变成取余数运算.有点像递归.

/* Formatted on 2017/3/9 17:32:23 (QP5 v5.269.14213.34769) */
SELECT stamp,to_date(yyyy||'/'||mm||'/'||dd||' '||hh||':'||mi||':'||ss,'yyyy-mm-dd hh24:mi:ss') begin_time ,next_time FROM (
  SELECT stamp
        ,FLOOR (stamp / (86400*31*12))+1988 yyyy
        ,FLOOR (MOD (stamp / (86400*31),12))+1 mm
        ,FLOOR (MOD (stamp / 86400, 31))+1 dd
        ,FLOOR (MOD (stamp / 3600, 24)) hh
        ,FLOOR (MOD (stamp / 60, 60)) mi
        ,MOD (stamp, 60) ss
        ,sequence#
        ,NEXT_TIME
        ,name
        ,first_time
    FROM v$archived_log
   WHERE dest_id = 1 AND name IS NOT NULL
ORDER BY 1);

--//自己可以写一些sql语句计算stamp转换日期:
$ cat stamp.sql
SELECT &&1 stamp,to_date(yyyy||'/'||mm||'/'||dd||' '||hh||':'||mi||':'||ss,'yyyy-mm-dd hh24:mi:ss') stamp_conv_time  from (
SELECT &&1
        ,FLOOR (&&1 / (86400*31*12))+1988 yyyy
        ,FLOOR (MOD (&&1 / (86400*31),12))+1 mm
        ,FLOOR (MOD (&&1 / 86400, 31))+1 dd
        ,FLOOR (MOD (&&1 / 3600, 24)) hh
        ,FLOOR (MOD (&&1 / 60, 60)) mi
        ,MOD (&&1, 60) ss
        from dual);

--//写成函数:
CREATE OR REPLACE FUNCTION stamp_conv_time (stamp NUMBER)
   RETURN DATE
IS
BEGIN
   RETURN TO_DATE
          (
                TO_CHAR (FLOOR (stamp / (86400 * 31 * 12)) + 1988)
             || '/'
             || TO_CHAR (FLOOR (MOD (stamp / (86400 * 31), 12)) + 1)
             || '/'
             || TO_CHAR (FLOOR (MOD (stamp / 86400, 31)) + 1)
             || ' '
             || TO_CHAR (FLOOR (MOD (stamp / 3600, 24)))
             || ':'
             || TO_CHAR (FLOOR (MOD (stamp / 60, 60)))
             || ':'
             || TO_CHAR (MOD (stamp, 60))
            ,'yyyy-mm-dd hh24:mi:ss'
          );
END;
/

--//以前分析错了,看来oracle内部这些时间戳应该都是安装这个公式计算得来的.
time = (((((yyyy - 1988) * 12 + mm - 1) * 31 + dd - 1) * 24 + hh) * 60 + mi) * 60 + ss;

时间: 2024-08-27 00:49:13

[20170309]关于v$archived_log.stamp字段的相关文章

[20170310]oracle内部时间戳的转换.txt

[20170310]oracle内部时间戳的转换.txt --//昨天验证v$archived_log.stamp时,链接如下http://blog.itpub.net/267265/viewspace-2135044/,才发现自己以前犯了严重错误. --//想起http://www.juliandyke.com/Diagnostics/Dumps/RedoLogs.php转储redo时time参数使用: TIME The minimum and maximum time is a decima

[20150625]v$archived_log字段creator.txt

[20150625]v$archived_log字段creator.txt --如果有人问你知道那个archivelog是日志满切换产生的,还是手工执行切换产生的.估计你的回答是看归档日志的大小,当然这个不是 --很准确. --实际上v$archived_log有一个字段creator可以反映这个情况: SYS@test> @ &r/ver1 PORT_STRING                    VERSION        BANNER ----------------------

[20170309]关于在线日志与归档2.txt

[20170309]关于在线日志与归档2.txt --//当日志写满了,或者执行手工了切换,再或者rman备份时有时也会触发日志切换: alter system switch logfile ; alter system archive log current ; --//本文简单探究日志归档是如何保存的.探查日志文件头块. 1.环境: --//启动到mount状态. SYS@book> @ &r/ver BANNER ------------------------------------

oracle中v$archived_log中显示creator是rman

Q:$archived_log中显示creator有多种,如果是FGRD,这可能是alter system archive log current,那么还有看到是RMAN,这是怎么产生的? A:可能是这些archive之前被rman catalog过.见下面的testcase: [oracle10g@testdb archivelog]$ cd 2014_09_28 [oracle10g@testdb 2014_09_28]$ ls o1_mf_1_51_b2g3dm1s_.arc  o1_mf

[20160119]V$RMAN_OUTPUT的stamp.txt

[20160119]V$RMAN_OUTPUT的stamp.txt --今天检查无意中发现2016/1/2日志切换频繁.http://blog.itpub.net/267265/viewspace-1979024/ --放假回来后检查发现dg磁盘空间满了,当时清除我并有仔细看,因为没有相关记录,我想看看当时如何执行一些操作, --查询V$RMAN_OUTPUT发现里面并没有明显的时间记录,仅仅存在STAMP,SESSION_STAMP,RMAN_STATUS_STAMP字段. --我自己想做一些

X$KCCDI部分字段解析和DUMP信息和V$DATABASE进行对应

X$KCCDI是对应了DUMP CONTROLFILE中数据库信息部分的视图,其中V$DATABASE基本来自于此FIXED TABLE,为了能够更好的备查今记录于此 数据库信息 TRACE文件 (size = 316, compat size = 316, section max = 1, section in-use = 1,   last-recid= 0, old-recno = 0, last-recno = 0)  (extent = 1, blkno = 1, numrecs =

sql-数据库视图里要创建一个计算的字段,如何避免被除数为零

问题描述 数据库视图里要创建一个计算的字段,如何避免被除数为零 数据库视图里要创建一个字段,是个除法,但被除数可能为零,我按照网上讲的CASE WHEN方法改了之后,总提示我表达式无效或缺少,我贴出来我的代码 ROUND(CASE WHEN V_RECOMMAND_CANDIDATE.vote_total > 0 THEN ((CAST(RECOMMAND_CANDIDATE_1.vote_agree AS FLOAT) / V_RECOMMAND_CANDIDATE.vote_total *

如何取出sqldatareader的字段值

SqlDataRead myDR;可以使用SqlDataRead.getString(1)或者SqlDataRead["字段名"].ToString()取值,用[]必须加System.Convert里面的方法对其转值,而用字段索引号,可以直接使用GetString,GetInt,GetDateTime等,这些方法名可能写错了,大家自己查吧. 

动态字段名-linq 字段名动态改变 动态添加数据

问题描述 linq 字段名动态改变 动态添加数据 我遇到的问题是: 我要添加的一张表的字段名是动态的,也就是说A网页调用A数据表,B网页调用B数据表.我现在希望写一个基类,来完成这两个表的添加数据操作,而不是采用 表名A.字段名a = 值; 表名A.字段名b = 值; 表名B.字段名c = 值; 表名B.字段名d = 值;的方式进行赋值.我希望的格式为: 表名(是个变量).字段名(是个变量)= 值.谢谢! 解决方案 http://www.cnblogs.com/gmtyt/archive/201