68

Oracle 的默认日期格式是 YYYY-MM-DD。这意味着如果我这样做:

 select some_date from some_table

...我失去了约会的时间部分。

是的,我知道您可以通过以下方式“解决”此问题:

 alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

但是说真的,为什么上面的不是默认值?特别是在 DBMS 中,两种主要的时间跟踪数据类型(DATE 和 TIMESTAMP)都有一个时间分量,包括(至少)精度低至 1 秒。

4

12 回答 12

85

您确定没有将 Oracle 数据库与 Oracle SQL Developer 混淆吗?

数据库本身没有日期格式,日期以原始形式从数据库中出来。由客户端软件来渲染它,SQL Developer确实使用 YYYY-MM-DD 作为其默认格式,我同意这几乎没用。

编辑:正如下面评论的那样,SQL Developer 可以重新配置以正确显示 DATE 值,它只是有不好的默认值。

于 2009-12-03T08:04:09.600 回答
56

如果您使用此查询为您的数据仓库生成输入文件,那么您需要适当地格式化数据。基本上在这种情况下,您将日期(确实具有时间组件)转换为字符串。您需要明确格式化您的字符串或更改您的 nls_date_format 以设置默认值。在您的查询中,您可以简单地执行以下操作:

select to_char(some_date, 'yyyy-mm-dd hh24:mi:ss') my_date
  from some_table;
于 2009-12-03T14:03:52.967 回答
22

YYYY-MM-DD 格式是ISO8601标准的一部分,用于交换日期(和时间)信息。

Oracle 采用这样的ISO标准是非常勇敢的,但同时也很奇怪他们没有一路走下去

一般来说,人们抵制任何不同的东西,但有很多好的国际理由

我知道我说的是革命性的东西,但我们都应该接受 ISO 标准,即使我们一次做一点

于 2009-12-03T06:34:49.060 回答
13

Oracle 最大的 PITA 是没有默认的日期格式!

在您的 Oracle 安装中,区域设置和安装选项的组合已选择(非常明智!)YYYY-MM-DD 作为输出日期的格式。另一个安装可能选择了“DD/MM/YYYY”或“YYYY/DD/MM”。

如果您希望您的 SQL 可移植到另一个 Oracle 站点,我建议您始终在您的 SQL 的每个日期列周围 包装一个TO_CHAR(datecol,'YYYY-MM-DD')或类似的函数,或者在连接后立即设置默认格式

ALTER SESSION 
SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; 

或类似的。

于 2009-12-03T06:34:19.967 回答
10

依靠将默认值设置为特定值(恕我直言)是不明智的,无论是日期格式、货币格式、优化器模式还是其他。您应该始终在服务器、客户端或应用程序中设置所需的日期格式值。

特别是,在转换日期或数字数据类型以进行显示时,切勿依赖默认值,因为对数据库的一次更改可能会破坏您的应用程序。始终使用显式转换格式。多年来,我在 Oracle 系统上工作,开箱即用的默认日期显示格式是 MM/DD/RR,这让我抓狂,但至少迫使我始终使用显式转换。

于 2009-12-03T07:47:20.117 回答
8

大多数 IDE 可以为某些类型的数据配置默认掩码,如日期、货币、小数点分隔符等。

如果您使用的是Oracle SQL Developer

工具 > 首选项 > 数据库 > NLS

日期格式:YYYY-MM-DD HH24:MI:SS

于 2014-09-02T12:37:23.540 回答
5

这是客户端的“问题”,而不是真正的 Oracle 问题。

以这种方式格式化和显示日期的是客户端应用程序。

在您的情况下,它是 SQL*Plus 进行这种格式化。
其他 SQL 客户端有其他默认值。

于 2011-01-06T00:14:47.920 回答
5

每个 SQL 标准的 DATE 值是 YYYY-MM-DD。因此,即使 Oracle 存储了时间信息,我的猜测是它们以与 SQL 标准兼容的方式显示值。在标准中,有包含日期​​和时间信息的 TIMESTAMP 数据类型。

于 2009-12-03T06:31:29.910 回答
3

我不是甲骨文用户(好吧,无论如何最近),但是......

在大多数数据库(以及精确的语言)中,日期不包括时间。有一个日期并不意味着您在该日期表示特定的秒数。通常,如果您需要时间和日期,则称为时间戳。

于 2009-12-03T06:14:16.643 回答
1

原因:如果您正在查看带有时间戳的数据列,_MOST_IMPORTANT_ 位信息就是年份。如果数据已经在数据库中保存了十年,那么了解这一点很重要。所以一年是第一位的。

接下来是一个月,然后是一天、一小时、一分钟,这是有道理的。客观地说,这些是最符合逻辑的时间数据显示顺序。

同样有意义的是,如果您要默认显示数据,则应仅显示数据的最重要部分,因此默认情况下仅显示 YMD。可以显示其他所有内容,但默认情况下它不会使您的 sql 报告混乱。

如果显示 YMD,则按日期排序是合乎逻辑的,因为它是连续的。计算机擅长顺序,而且看起来合乎逻辑。

最后。你想要 MDY 的偏见就是你的偏见。即使在美国,也不是每个人都使用这种格式。所以使用最合乎逻辑的格式,当其他人决定默认是合乎逻辑的时不要生气。

(我是美国出生的,我不代表 Oracle。但是,我可以自己考虑)

于 2014-12-30T19:09:38.870 回答
1

Oracle 同时具有 Date 和 Timestamp 数据类型。

根据Oracle 文档,Date 和 Timestamp 之间的数据大小存在差异,因此当打算使用 Date only 字段时,显示 Date 格式是有意义的。此外,“它没有小数秒或时区。” - 所以当需要时间戳信息时,它不是最佳选择。

日期字段可以轻松格式化以显示 Oracle SQL Developer 中的时间组件 -在 PL/SQL Developer 中运行的日期查询显示时间,但在 Oracle SQL Developer 中不显示。但它不会显示小数秒或时区 - 为此您需要 Timestamp 数据类型。

于 2013-03-27T09:31:13.127 回答
-3

要回答您的问题,即为什么默认日期不显示 TIME 部分,我找到的唯一答案是

Oracle 团队由 LAZY 开发人员或负责人组成 :-)

为什么 ?

因为 SQL 中存在 DATE、TIME 和 DATETIME 数据类型,而 Oracle 还没有实现它!!!

这对甲骨文来说是一种耻辱。

但是对您的问题的正确答案不是定义 FIX 默认格式,而是定义仅显示有效数字的 SIGNIFICANT 默认格式,以便显示的 DATE、TIME 或 DATETIME 值(默认情况下)始终包含所有重要数字。

例子:

2015-10-14          will be displayed as 2015-10-14 (or default DATE format)
2018-10-25 12:20:00 will be displayed as 2018-10-25 12:20
1994-04-16 16       will be displayed as 1994-04-16 16

原理很简单。

作为 DATE 一部分的所有数字将始终显示为浮点数的整数部分。对于 TIME 部分,只有重要部分将显示为浮点数的 DECIMAL 部分。自然,对于 TIME 类型(仅 HH:MM:SS),DATE 部分永远不会显示。

于 2018-06-21T07:31:11.017 回答