Oracle时间戳数据类型

55

没有参数的时间戳数据类型和带有参数0的时间戳数据类型之间有什么不同:

timestamptimestamp(0) 的区别:

2个回答

66

括号中的数字指定了要存储的小数秒的精度。 因此,(0)表示不存储任何小数秒,仅使用整秒。 如果未指定,则默认值为小数分隔符后的6个数字。

因此,未指定值将存储如下日期:

TIMESTAMP 24-JAN-2012 08.00.05.993847 AM

指定 (0) 仅存储:

TIMESTAMP(0) 24-JAN-2012 08.00.05 AM

查看 Oracle 数据类型文档。


非常感谢,你回答得更快,所以我接受了你的答案,尽管两个都是正确的。 - hudi
5
@hudi - 很明显,迈克尔和我都不需要积分,所以我在这里并不是在追求声望。一般的原则是你应该接受最佳答案,而不仅仅是第一个(除非第一个也是最好的)。请在今后评判答案时记住这一点。 - APC
2
只是为了明确,我并不是说迈克尔的答案比我的更好。 - APC

32

简单来说,该数字是时间戳的精度,即列中以秒为单位的小数部分:

SQL> create table t23
  2  (ts0 timestamp(0)
  3   , ts3 timestamp(3)
  4  , ts6 timestamp(6)
  5  )
  6  /

Table created.

SQL> insert into t23 values (systimestamp, systimestamp, systimestamp)
  2  /

1 row created.

SQL> select * from t23
  2  /

TS0
---------------------------------------------------------------------------
TS3
---------------------------------------------------------------------------
TS6
---------------------------------------------------------------------------
24-JAN-12 05.57.12 AM
24-JAN-12 05.57.12.003 AM
24-JAN-12 05.57.12.002648 AM


SQL> 

如果没有指定精度,时间戳默认为六位。

SQL> alter table t23 add ts_def timestamp;

Table altered.

SQL> update t23      
  2  set ts_def = systimestamp
  3  /

1 row updated.

SQL> select * from t23
  2  /

TS0
---------------------------------------------------------------------------
TS3
---------------------------------------------------------------------------
TS6
---------------------------------------------------------------------------
TS_DEF
---------------------------------------------------------------------------
24-JAN-12 05.57.12 AM
24-JAN-12 05.57.12.003 AM
24-JAN-12 05.57.12.002648 AM
24-JAN-12 05.59.27.293305 AM


SQL> 
请注意,我正在运行Linux系统,所以我的TIMESTAMP列实际上可以精确到六位,即微秒。这在大多数(所有?)Unix版本中也是如此。在Windows上,限制为三个位置,即毫秒。(最现代的Windows版本是否仍然如此-需要引证)。如预期的那样,文档涵盖了这一点。了解更多

“当你创建timestamp(9)时,这会给你纳秒,对吗?”

仅当操作系统支持它时才是这样。正如您所看到的,我的OEL设备不支持:

SQL> alter table t23 add ts_nano timestamp(9)
  2  /

Table altered.

SQL> update t23 set ts_nano = systimestamp(9)
  2  /

1 row updated.

SQL> select * from t23
  2  /

TS0
---------------------------------------------------------------------------
TS3
---------------------------------------------------------------------------
TS6
---------------------------------------------------------------------------
TS_DEF
---------------------------------------------------------------------------
TS_NANO
---------------------------------------------------------------------------
24-JAN-12 05.57.12 AM
24-JAN-12 05.57.12.003 AM
24-JAN-12 05.57.12.002648 AM
24-JAN-12 05.59.27.293305 AM
24-JAN-12 08.28.03.990557000 AM


SQL> 

这些末尾的零可能看起来是巧合,但实际上它们并不是。


嗯,但是当你创建 timestamp(9) 时,这会给你纳秒对吧? - hudi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接