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


67

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秒的时间。


3
请不要关闭;我真的很欢迎来自Oracle社区的一些有经验的成员的解释/合理化。
亚伦·

7
精度不会丢失-只是不会显示。每个数据库都有它的怪癖-这是我最不关心的问题。IMO:SQL Server缺少隐式数据类型转换是更大的PITA。
OMG Ponies,

6
亚伦,任何人都不应出于任何目的使用“选择*”,而只能观察数据。假设更改了列数,或更改了NLS设置-那又如何?使用的列的显式列表与必要的转换,格式口罩等
叶戈尔罗戈夫

17
哇,这就像在抱怨购车中的默认座椅位置...“默认位置一直都在后面,哦,亲爱的上帝,为什么?” ...只需将它更改一次即可,然后离开它!:)
Jeffrey Kemp

7
通过OCI从oracle选择日期将返回一个七个字节的值。CLIENT SOFTWARE负责将其转换为字符串。对于ODBC / JDBC,驱动程序将七个字节的值映射到适当的本地数据类型中。
加里·迈尔斯

Answers:


55

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

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

84

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

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

编辑:如下所述,SQL Developer可以重新配置为正确显示DATE值,但默认设置错误。


33
在SQL Developer中,工具>首选项>数据库> NLS参数...可以设置13个参数来控制默认值。
David Aldridge

8
足够公平,可以配置,但是为什么要投票?我的观点仍然是,这是客户端软件的一个方面,而不是数据库的一个方面。
skaffman

我认为不依赖默认值的原则是通用的,而不是依赖于工具的,所以我并不认为这很相关。
David Aldridge

21

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

Oracle非常勇敢地采用这样的ISO标准,但是同时,奇怪的是它们并没有一路走来

通常,人们会抗拒任何不同的东西,但是有很多良好的国际理由要这样做。

我知道我在说革命性的东西,但我们都应该怀抱ISO标准,甚至是我们做这一点在同一时间


13

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

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

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

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

或类似。


4
DBA可以根据需要在系统范围内设置任何NLS_DATE_FORMAT。但是,通常数据库仅以7字节内部日期格式返回一个值,并且客户端软件会自己完成将其转换为字符串的工作。
加里·迈尔斯

如果Oracle具有硬编码的默认日期格式,请告诉我-它应该是哪一个?以及您如何建议向世界上所有希望将其变成其他事物的人们解释呢?(总是有人对做出的决定不满意!)Oracle没有硬编码的默认日期格式,因为Oracle是一种商业产品,试图满足所有用户的需求。
鲍勃·贾维斯

1
缺少默认/中间日期格式确实是造成问题的原因,因为开发人员认为他们系统上的任何格式都是所有基于Oracle的系统的通用格式。甚至同一数据中心内的系统也可以具有不同的默认值。我已经看到由于缺乏标准化而导致的许多问题。
詹姆斯·安德森

10

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

特别是,出于显示目的而转换日期或数字数据类型时,切勿依赖默认值,因为对数据库的单个更改可能会破坏您的应用程序。始终使用显式转换格式。多年以来,我一直在使用默认的日期显示格式为MM / DD / RR的Oracle系统上工作,这使我很烦,但至少迫使我始终使用显式转换。


8

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

如果您使用的是Oracle SQL Developer

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

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


5

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


5

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

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

您的情况是使用SQL * Plus进行这种格式化。
其他SQL客户端具有其他默认值。


3

我不是Oracle用户(好吧,最近还是这样),但是...

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


2
尼克,谢谢你的答复。我从概念上同意您的观点。看来Oracle的两种类型,DATE和TIMESTAMP,都有时间成分。只是TIMESTAMP降低了粒度(不到1秒)。 it.toolbox.com/blogs/database-solutions/… 您可能会认为两种类型都包含时间成分是没有YYYY-MM-DD显示格式的原因。
亚伦·

3
@Nick:Oracle的DATE类型具有一秒的精度。它的名字不好。
skaffman

@skaffman:如果它们的默认字符串格式设置为仅包括日期部分,并且分别具有更高分辨率的TIMESTAMP数据类型,则名称的命名显然不是那么糟糕。当然,我不知道他们的实际建议是什么,但是在提议的用法上,这对我来说似乎是很明显的区别。(当然,与往常一样,数据库的事情从来都不是那么清楚……)
Nick Bastin

1

Oracle具有Date和Timestamp数据类型。

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

日期字段可以很容易地设置格式,以显示Oracle SQL Developer中的时间部分-在PL / SQL Developer中运行的日期查询显示时间,但在Oracle SQL Developer中不显示时间。但它不会显示小数秒或时区-为此,您需要使用Timestamp数据类型。


1

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

接下来的月份是月份,然后是天,小时,分钟。客观地讲,这些是显示时间数据的最合理的顺序。

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

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

最后。您想要MDY的偏见就是您的偏见。即使在美国,也不是每个人都使用这种格式。因此,请使用最合乎逻辑的格式,并且在其他人默认为逻辑时不要生气。

(我是美国出生的,我不代表甲骨文。但是,我可以自己考虑一下)


-3

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

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部分。对于时间部分,将仅显示有效部分,而对于浮点数的DECIMAL部分则将显示。自然,对于TIME类型(仅HH:MM:SS),永远不会显示DATE部分。


如果您会拒绝投票,请给出一些解释?示例:您在Oracle的工作或您有一些Oracle行动:-)
schlebe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.