8

Oracle 10g 数据库中使用哪种数据类型来存储日期时间(不仅是日期,还有时间)?我读过一些地方(可能是错误的)“ Oracle 10g 中的 Date 数据类型可以存储日期时间”,但是当我尝试这样做时,事情似乎没有发生。

DATE 数据类型是日期时间数据类型。它存储日期和时间。日期部分基于自公元前 4712 年 1 月 1 日以来的天数。时间部分基于自午夜以来的秒数。链接

我通过 Java 作为前端并直接在 Oracle 终端上使用以下 SQL 进行了尝试。

insert into discount 
values(7, 'Code', 12.5, to_date('11-AUG-2012 06:05:23', 'dd-mon-yyyy hh:mi:ss'), 
to_date('20-AUG-2012 07:50:23', 'dd-mon-yyyy hh:mi:ss'))

它可以工作,但是(在这两种情况下)Oracle 只是忽略时间部分并只插入 SQL 中指定的日期而没有任何错误?

Oracle 10g 中使用哪种数据类型来存储日期时间?是TimeStamp吗?

4

2 回答 2

11

Oracle 中的ADATE总是有一个日期组件和一个时间组件。假设表中的最后两列DISCOUNT被声明为DATE,Oracle 不太可能简单地忽略时间部分。

是什么让你相信时间部分被忽略了?我的猜测是您正在通过运行类似的查询来检查数据

SELECT *
  FROM discount

来自 SQL*Plus、SQL Developer、TOAD 或其他一些 GUI。如果你这样做,默认情况下,显示的日期将只有一个日期部分,而不是一个时间部分。这并不意味着时间部分被丢弃。相反,它是具有NLS_DATE_FORMAT不显示时间组件的默认值的结果。您可以通过在查询中执行显式来强制显示时间组件TO_CHAR(请注意,我在猜测您的列的名称)

SELECT discount_id, 
       discount_type, 
       discount_amt, 
       to_char( discount_start_date, 'MM/DD/YYYY HH24:MI:SS' ),
       to_char( discount_end_date, 'MM/DD/YYYY HH24:MI:SS' )
  FROM discount

或者通过更改您的默认值NLS_DATE_FORMAT

ALTER SESSION SET nls_date_format = 'MM/DD/YYYY HH24:MI:SS';
SELECT *
  FROM discount;
于 2012-08-09T02:24:59.573 回答
4

甲骨文DATE也包括时间。从文档

DATE 数据类型概述

DATE 数据类型将时间点值(日期和时间)存储在表中。DATE 数据类型存储年(包括世纪)、月、日、小时、分钟和秒(午夜之后)。

可能是您使用的工具(SQL Developer、SQL*Plus)在欺骗您。尝试

select to_char(your_date, 'dd-mm-yy hh:mi:ss') from discount

另请注意,日期数据类型仅存储到秒。TIMESTAMP或者TIMESTAMP WITH TIME ZONE更精确。

于 2012-08-09T02:25:16.877 回答