datetime类型与timestamp类型有什么区别?

解决方案 »

  1.   

    测试结果select sysdate from dual;
    --2010-4-30 15:51:14
    select systimestamp from dual;
    --1 30-4月 -10 03.51.14.718000 下午 +08:00
      

  2.   

    你可以自已存一个毫秒进去select to_timestamp('2010-01-01 01:01:01.123456', 'yyyy-mm-dd hh24:mi:ss.ff6') from dual;用这个看看就知道了
      

  3.   

    --引自官方文档
    The TIMESTAMP datatype is an extension of the DATE datatype. It stores the year, month, and day of the DATE datatype, plus hour, minute, and second values. This datatype is useful for storing precise time values. SQL> select sysdate from dual;SYSDATE
    ---------
    30-APR-10SQL> select systimestamp from dual;SYSTIMESTAMP
    ---------------------------------------------------------------------------
    30-APR-10 04.26.10.577624 PM +08:00SQL> 
      

  4.   

    timestamp有时区的概念,date没有。
    oracle没有datetime类型
      

  5.   

    首先说明ORACLE没有DATETIME类型,全部是DATE,应该是DATE与timestamp的区别:timestamp 是时间戳,它和DATE最大的区别就是ORACLE的DATE只能精确到秒取计算,如果是秒一下的运算将会四舍五入算成秒级别。而timestamp可以精确到后面6位,一般前三位是有效的,它可以精确的记录每一个时间点,所以ORACLE会用它来做事务控制点的参数,它和数据库的SCN号码也是对应起来的,因为如果直接用DATE来记录时间戳在一秒内可能发生多次操作,所以用timestamp 去对应操作是较为精确的,你也可以通这种方式来完成一些特殊的操作步骤,如定位一些过程的执行时长、操作错误时间戳记录点将其写入日志。至于操作,常用的有:
    --提取当前系统时间的时间戳
    select systimestamp from dual;两个时间戳做差:DECLARE
       d1 timestamp:=systimestamp;
       tm number;
     BEGIN
        for i in 1..10000 loop
          select i into tm FROM dual;
        end loop;
        dbms_output.put_line('使用select into耗时:'||(systimestamp-d1));
        d1 := systimestamp;
        for i in 1..10000 loop
          tm := i;
        end loop;
        dbms_output.put_line('使用赋值的方式耗时:'||(systimestamp-d1));
     END;
    时间戳变成SCN号码:
    SELECT timestamp_to_scn(systimestamp) FROM dual;
    通过SCN换成时间戳:
    SELECT scn_to_timestamp(<SCN号码>) FROM dual;通过查询根据时间戳被删除掉的数据,在回滚段中查找,若数据太早的回滚段被冲掉就会报错,不过最近的一般都能找到(假如有张表叫:test):
    select versions_xid xid,
           versions_operation op,
           versions_startscn startscn,
           versions_endscn endscn,
           rowid,
           test.*
      from test versions between TIMESTAMP 
      to_timestamp('2010-04-30 12:20:00','YYYY-MM-DD HH24:MI:SS') and maxvalue;查找到对应的时间戳后可以根据时间戳进行那个时间点的数据恢复:
    ALTER TABLE test ENABLE ROW MOVEMENT;--设置可以进行ROWID迁移
    FLASHBACK TABLE test 
       to TIMESTAMP to_timestamp('2010-04-30 12:20:00','YYYY-MM-DD HH24:MI:SS');
    ALTER TABLE test DISABLE ROW MOVEMENT;