【发布时间】:2018-10-04 01:53:42
【问题描述】:
我有一个表格,其中包含 date(datecreated) 列和示例数据 2.10.2017 所以我想知道插入数据的时间,但我只存储日期而不是时间。 我可以提取时间吗?
【问题讨论】:
-
使用
trunc(datecreated)。
我有一个表格,其中包含 date(datecreated) 列和示例数据 2.10.2017 所以我想知道插入数据的时间,但我只存储日期而不是时间。 我可以提取时间吗?
【问题讨论】:
trunc(datecreated)。
时间分量肯定是有的,使用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'));
日期的时间分量将为零。
【讨论】:
Oracle 中的date 类型还包括小时、分钟等。因此,除非您在插入时截断它,否则它会被存储。但是在默认设置下,一些客户端不显示它们。
试试
SELECT to_char(datecreated, 'YYYY-MM-DD HH24:MI:SS')
FROM elbat;
获取年、月、日、时、分、秒。
【讨论】:
这是一个常见的误解 - 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_CHAR 或EXTRACT 函数提取它们;如果你不指定值,它们默认为零。
我只存储日期而不是时间。我可以抽出时间
不,如果您没有指定时间,那么 Oracle 会将日期值的小时、分钟和秒默认为 00:00:00。
如果您使用SYSDATE(或类似的东西)插入日期,那么它将有一个非零时间组件,并且您的用户界面不会显示时间组件,您可以使用TO_CHAR等。覆盖用户界面的默认日期格式并获取信息。
【讨论】: