Oracle的默认日期格式是YYYY-MM-DD,为什么?

时间:2009-12-03 06:07:38

标签: oracle date-formatting

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秒。

12 个答案:

答案 0 :(得分:81)

您确定不会将Oracle数据库与Oracle SQL Developer混淆吗?

数据库本身没有日期格式,日期以原始格式从数据库中出来。由客户端软件来呈现它,而SQL Developer 使用YYYY-MM-DD作为其默认格式,这是无用的,我同意。

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

答案 1 :(得分:53)

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

select to_char(some_date, 'yyyy-mm-dd hh24:mi:ss') my_date
  from some_table;

答案 2 :(得分:21)

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

采用像这样的 ISO 标准是非常勇敢的,但与此同时,奇怪的是他们并没有一路走来

一般来说,人们抵制任何不同的东西,但有很多good International reasons

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

答案 3 :(得分:12)

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

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

如果你希望你的SQL可以移植到另一个Oracle站点,我建议你总是在你的SQL的每个日期列中包装一个TO_CHAR(datecol,'YYYY-MM-DD')或类似的函数,或者立即设置defualt格式用

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

或类似。

答案 4 :(得分:9)

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

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

答案 5 :(得分:7)

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

如果您使用的是 Oracle SQL Developer

工具>偏好>数据库> NLS

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

答案 6 :(得分:5)

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

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

在你的情况下,它是SQL * Plus执行此格式化。
其他SQL客户端具有其他默认值。

答案 7 :(得分:4)

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

答案 8 :(得分:2)

我不是Oracle用户(最近无论如何),但是......

在大多数数据库中(以及精确的语言),日期不包括时间。拥有约会并不意味着您在该日期表示特定的第二个。通常,如果您想要时间和日期,那就称为时间戳。

答案 9 :(得分:1)

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

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

可以轻松格式化Date字段以在Oracle SQL Developer中显示时间组件 - Date query ran in PL/SQL Developer shows time, but does not show in Oracle SQL Developer。但它不会显示小数秒或时区 - 为此您需要Timestamp数据类型。

答案 10 :(得分:1)

原因: 如果您正在查看带有时间戳的数据列,则_MOST_IMPORTANT_位信息就是年份。如果数据在数据库中存在了十年,那么重要的是要知道。所以今年是第一位的。

有意义的是下个月,然后是日,小时,分钟。客观地说,这些是显示时间数据的最合理的序列。

如果您要默认显示数据,也应该只显示数据中最重要的部分,因此默认情况下只显示Y-M-D。可以显示其他所有内容,但默认情况下它不会使您的sql报告混乱。

如果显示Y-M-D,则按日期排序是合乎逻辑的,因为它是顺序的。计算机擅长顺序,看起来合乎逻辑。

最后。你想要M-D-Y的偏见是你的偏见。即使在美国,也不是每个人都使用这种格式。因此,使用最合乎逻辑的格式,并且在其他人决定默认为逻辑时不要被激怒。

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

答案 11 :(得分:-1)

要回答为什么是默认日期的问题,请不要显示“时间”部分,我发现的唯一答案是

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

为什么?

由于SQL中存在DATE,TIME和DATETIME数据类型,而Oracle尚未实现它!

这对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的所有数字将始终显示为浮点数的INTEGER部分。对于时间部分,仅浮点数中的有效部分将显示为十进制部分。 自然,对于TIME类型(仅HH:MM:SS),永远不会显示DATE部分。