我们可以从仅存储日期而不存储时间的日期列中提取时间吗?

时间:2018-10-04 01:53:43

标签: sql oracle date oracle12c

我有一个表,其中包含列date(创建日期)和示例数据2.10.2017 所以我想知道插入数据的时间,但是我只存储日期而不是时间。 我可以抽出时间吗?

3 个答案:

答案 0 :(得分:2)

时间部分肯定存在,您可以使用TO_CHAR看到它:

SELECT TO_CHAR(DATECREATED, 'DD-MON-YYYY HH24:MI:SS')
  FROM YOUR_TABLE;

但是,如果您没有设置创建记录的时间,则HOUR,MINUTE和SECOND字段都应为零。换句话说,如果您做了类似的事情

INSERT INTO YOUR_TABLE (DATECREATED) VALUES (TO_DATE('09-OCT-2010', 'DD-MON-YYYY'));

日期的时间部分将为零。

dbfiddle here

答案 1 :(得分:1)

Oracle中的date类型还包括小时,分钟等。因此,除非在插入时将其截断,否则它将被存储。但是在默认设置下,某些客户端不显示它们。

尝试

SELECT to_char(datecreated, 'YYYY-MM-DD HH24:MI:SS')
       FROM elbat;

获取年,月,日,时,分和秒。

答案 2 :(得分:1)

这是一个常见的误解-DATE数据类型始终为stored in Oracle tables as 7 bytes,其中包含年(2个字节),月,日,小时,分钟和秒(每个1字节)。它永远不会只存储年/月/日部分。

但是,如果您没有向Oracle提供任何有关放入时间组件的信息,那么Oracle会将这些组件设置为默认值零。

因此,如果您这样做:

CREATE TABLE table_name ( value DATE );
INSERT INTO table_name
  SELECT DATE '2018-01-01' FROM DUAL UNION ALL
  SELECT CAST( TIMESTAMP '2018-10-04 08:20:14' AS DATE ) FROM DUAL;

然后:

SELECT TO_CHAR( value, 'YYYY-MM-DD"T"HH24:MI:SS' ) AS formatted,
       DUMP( value ) AS dmp,
       EXTRACT( HOUR FROM CAST( value AS TIMESTAMP ) ) As hr
FROM   table_name;

输出:

FORMATTED           DMP                                HR
------------------- ---------------------------------- --
2018-01-01T00:00:00 Typ=12 Len=7: 120,118,1,1,1,1,1     0
2018-10-04T08:20:14 Typ=12 Len=7: 120,118,10,4,9,21,15  8

表明时间成分在那里;您可以使用TO_CHAREXTRACT函数提取它们;如果您未指定值,则默认为零。

  

我只存储日期,不存储时间。我可以提取时间

否,如果您未指定时间,则Oracle将日期值的小时,分​​钟和秒默认为00:00:00

如果您使用SYSDATE(或类似的名称)插入日期,则它将具有非零的时间成分,并且用户界面只是不显示时间成分,您可以使用{{1} }等以覆盖用户界面的默认日期格式并获取信息。