【问题标题】:dates and Oracle Database日期和 Oracle 数据库
【发布时间】:2015-12-19 06:30:09
【问题描述】:

我想知道Oracle环境中的哪个参数导致这个:

假设我在两个不同的服务器上有两个数据库。数据库中的数据相同。

在 sql developer 下我写了这个查询:

select to_char(date_column, 'DD/MM/YYYY') from my_table;

当我在 sql developer 中检查 my_table 时,日期显示为 'DD/MM/YY' 格式

在一台服务器上,查询返回: 1945 年 1 月 5 日(很好) 但另一方面: 01/05/2045(不好)。

问题:配置中的参数有什么不同?我的 ksh 脚本中这个参数的值应该是什么才能使它在两个基础上都起作用?

注意:替换 20 而不是 19 仅适用于本世纪前 50 年的日期。 实际上,在这两个数据库上,都显示了 01/05/1955。

谢谢


转储功能的结果:在这个日期 09/05/55 尝试

好的:

09/05/1955 Typ=12 Len=7: 119,155,5,9,1,1,1

坏的:

09/05/55 Typ=12 Len=7: 119,155,5,9,1,1,1

这是否称为不同存储?或者显示不同。在这两种情况下,存储了相同的字节,但我在问。

另外我想说的是,数据插入数据库的方式是通过拷贝来的


两个查询的结果:

在好的服务器上:

NUM NAME               TYPE   VALUE
224 nls_date_language  2           
225 nls_date_format    2      DD/MM/YYYY

PARAMETER              VALUE
NLS_DATE_FORMAT        DD/MM/YYYY
NLS_DATE_LANGUAGE      AMERICAN

选错了

NUM NAME               TYPE   VALUE
224 nls_date_language  2           
225 nls_date_format    2      

PARAMETER              VALUE
NLS_DATE_FORMAT        DD/MM/RR
NLS_DATE_LANGUAGE      FRENCH

【问题讨论】:

  • 它不会改变任何东西
  • 对不起,我想错了。您正在转换为一个字符,这意味着它已经是一个日期,这意味着您获取数据的原因是因为这就是数据库中的数据。将数据放入数据库时​​,您必须使用RRRRRR 日期格式进行转换?
  • 不,不是……两个数据库上的数据是一样的。
  • 只是再次检查:您是否 100% 确定您在两台服务器中都有 DATE 类型的列和相同的数据?如果列是 CHAR 或 VARCHAR,这可以解释这一点。
  • 听起来数据在一个数据库中以 YY 格式插入,在另一个数据库中以 YYYY 格式插入。

标签: sql oracle date


【解决方案1】:

输出不同的原因是您的数据库中的数据不同(希望 date_column 的类型是日期)。
使用此查询来检查:

select date_column, dump(date_column) from my_table;

dump 函数将返回实际存储的数据类型、列长度和字节数。
这两个日期不同的原因可能在于插入方式。
如果您使用字符串转换为日期并且字符串仅包含 2 位年份,则可能会出现不同的结果。对于这样的字符串 YY 和 RR,甚至存在 2 种不同的格式。 http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34924
这是日期格式元素的列表以及如何使用它们的详细信息。
在日期格式中,Oracle 存储完整的年份,因此不可能将模棱两可的转换为 to_char
(这里是How are dates stored in Oracle?的描述)

【讨论】:

  • 是的,我同意,最可能的原因是在输入时使用了 2 位数年份,其中假设和存储了错误的世纪(因此有 100 年的差异)
  • 这真的很奇怪。日期存储正确 - 结果是 119-100 = 19(世纪),155-100=55(年)1955。
  • 尝试 ALTER SESSION SET nls_date_format = 'DD/MM/YYYY';在有问题的服务器上,然后再次运行您的查询 - 它应该返回正确的结果
  • 您能否发送以下查询的结果(来自没有更改会话的新会话) SELECT * FROM v$parameter WHERE NAME LIKE 'nls_date%'; SELECT * FROM v$nls_parameters WHERE 参数 LIKE 'NLS_DATE%';
  • 我试过 SET nls_date_format = 'DD/MM/YYYY';但它不会改变任何东西
【解决方案2】:

根据转储的值,这些值都已正确存储。区别必须在于以下 NLS 设置:

  1. 服务器
  2. 客户
  3. 工具。

如果您只是在 SQL Developer 中查看表格内容,而这正是显示差异发生的地方,那么最好的方法是专门为 SQL Developer 本身设置显示选项。

How can I set a custom date time format in Oracle SQL Developer?

确保您获得所需格式的唯一方法(这适用于服务器端应用程序和客户端)是应用程序本身设置其所需的 NLS 参数。否则,隐式转换总是有可能被外部配置项更改。

如果您在软件开发环境中工作,那么我建议您将您的 NLS_DATE_FORMAT 设置为“YYYY-MM-DD HH24:MI:SS”的 ISO 格式,这样它就完全没有歧义,并且任何时间元素始终显示日期。

【讨论】:

  • 据我了解,mlwacosmos 使用 to_char 函数,因此数据库将日期转换为字符,SQL Developer 返回字符。数据库如何错误地将日期转换为字符?
  • @AntonZaviriukhin:“当我在 sql developer 中检查 my_table 时,日期显示为 'DD/MM/YY'”。可能问题不清楚,不同的是通过表格浏览器查看数据的时候。这比 to_char 用相同的数据和格式图片渲染不同的字符串更有可能的解释。
  • 问题不在sqldeveloper。在 sql plus 中是相同的:两个服务器之间的日期显示不同
  • 您的意思是“问题不仅在 SQL Developer 中”。事实上,这两个应用程序都有问题,因为它们都没有指定您想要的 NLS 参数。您可以为客户端机器设置它们,但是该机器上的另一个应用程序可能会将它们设置为不同的东西。唯一可以确定的方法,这适用于服务器端应用程序以及客户端,是应用程序本身设置其所需的 NLS 参数。否则,隐式转换总是有可能被外部配置项更改。
  • 我的意思是 sql developer 不是问题,因为它似乎使用了数据库中设置的 nls_date_format。我以前没有意识到,但确实在 nls_date_format = DD/MM/YYYY 的好服务器上,sql developer 显示良好,而在另一个上它使用存储的参数 DD/MM/RR :这就是为什么我只有 2 位数时我用工具查看表格
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
相关资源
最近更新 更多