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秒。
答案 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部分。