日期和Oracle数据库

时间:2015-09-22 10:08:37

标签: sql oracle date

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

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

在sql developer下我写这个查询:

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

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

在一台服务器上,查询返回: 01/05/1945(很好) 但另一方面: 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

2 个答案:

答案 0 :(得分: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?

的描述

答案 1 :(得分:1)

根据转储的值,值都会正确存储。区别在于NLS设置:

  1. 服务器
  2. 客户
  3. 工具。
  4. 如果您只是查看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格式,因此它完全无歧义,并且始终显示日期中的任何元素。