代码之家  ›  专栏  ›  技术社区  ›  Aaron Fi

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

  •  67
  • Aaron Fi  · 技术社区  · 15 年前

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

     select some_date from some_table
    

    …我 失去 我约会的时间部分。

    是的,我知道你可以用以下方法来“修复”这个问题:

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

    但是严肃地说, 为什么 以上不是默认值吗?尤其是在DBMS中,两种主要的时间跟踪数据类型(日期和时间戳) 二者都 有一个包含(至少)精度小于1秒的时间分量。

    12 回复  |  直到 6 年前
        1
  •  53
  •   Doug Porter    15 年前

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

    select to_char(some_date, 'yyyy-mm-dd hh24:mi:ss') my_date
      from some_table;
    
        2
  •  81
  •   skaffman    15 年前

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

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

    编辑:正如下面所评论的,可以将SQL开发人员重新配置为正确显示日期值,它只是有错误的默认值。

        3
  •  21
  •   pavium    15 年前

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

    甲骨文很勇敢地接受了 国际标准化组织 像这样的标准,但同时,奇怪的是他们没有 一路走开 .

    一般来说,人们抵抗任何不同的东西,但是有很多 good International reasons 为了它。

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

        4
  •  12
  •   James Anderson    15 年前

    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'; 
    

    或类似的。

        5
  •  9
  •   David Aldridge    15 年前

    无论是日期格式、货币格式、优化模式还是其他什么,都不要依赖于默认值设置为特定值IMHO。您应该始终在服务器、客户机或应用程序中设置所需的日期格式值。

    尤其是,在为显示目的转换日期或数字数据类型时,不要依赖默认值,因为对数据库的单个更改可能会破坏应用程序。始终使用显式转换格式。多年来,我在Oracle系统上工作,该系统的开箱即用默认日期显示格式是mm/dd/rr,这让我很恼火,但至少迫使我总是使用显式转换。

        6
  •  7
  •   Fabio Farath Dimitri    10 年前

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

    如果您正在使用 Oracle SQL开发人员 :

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

    日期格式:yyyy-mm-dd hh24:mi:ss

        7
  •  5
  •   a_horse_with_no_name    14 年前

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

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

    在您的例子中,是SQL*PLUS进行这种格式化。
    其他SQL客户端有其他默认值。

        8
  •  4
  •   Harold L    15 年前

    根据SQL标准,日期值是YYYY-MM-DD。因此,即使Oracle存储时间信息,我猜想它们显示的值的方式与SQL标准兼容。在标准中,时间戳数据类型包括日期和时间信息。

        9
  •  2
  •   Nick Bastin    15 年前

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

    在大多数数据库中(用精确的语言),日期不包括时间。有约会并不意味着你在那个日期表示一个特定的秒。一般来说,如果你想要一个时间和日期,那就叫时间戳。

        10
  •  1
  •   Community CDub    8 年前

    Oracle同时具有日期和时间戳数据类型。

    根据 Oracle documentation ,日期和时间戳之间的数据大小存在差异,因此,当希望只有日期字段时,显示日期格式是有意义的。另外,“它没有小数秒或时区。”—所以当需要时间戳信息时,它不是最佳选择。

    日期字段可以很容易地格式化,以便在OracleSQL开发人员中显示时间组件。- Date query ran in PL/SQL Developer shows time, but does not show in Oracle SQL Developer . 但它不会显示小数秒或时区——为此,您需要时间戳数据类型。

        11
  •  1
  •   hollington    10 年前

    原因: 如果您查看的是一列带有时间戳的数据,那么最重要的信息就是年份。如果数据在数据库中保存了十年,那么需要知道这一点。所以一年比一年重要。

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

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

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

    最后。你想要M-D-Y的偏见就是你的偏见。不是每个人,甚至在美国都使用这种格式。所以,使用最符合逻辑的格式,不要在别人默认为合乎逻辑的时候生气。

    (我是我们的孩子,我不代表先知。但是,我可以自己思考)

        12
  •  -1
  •   schlebe    6 年前

    要回答你的问题,那就是为什么默认日期不显示时间部分,我找到的唯一答案是

    Oracle团队由懒惰的开发人员或负责人组成:—)

    为什么?

    因为日期、时间和日期时间数据类型存在于SQL中,而Oracle尚未实现它!!!!

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

    但对您的问题的正确答案不是定义固定默认格式,而是只显示有效数字的有效默认格式,以便显示的日期、时间或日期时间值(默认情况下)始终包含所有重要数字。

    例子:

    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
    

    原理很简单。

    作为日期一部分的所有数字将始终显示为浮点数的整数部分。对于时间部分,只有有效部分显示为浮点数中的小数部分。 当然,对于时间类型(仅hh:mm:ss),永远不会显示日期部分。