【问题标题】:Oracle database is returning date as 1951 instead of 2051Oracle 数据库返回日期为 1951 而不是 2051
【发布时间】:2020-10-28 11:58:39
【问题描述】:

您好,我正在使用输入字段在 UI 中输入日期并输入为 02/01/2051。它将以01-FEB-51 保存到数据库中,我使用DATE 作为数据类型。当我获取它时,它以01-feb-1951 的形式返回。以下是我正在使用的查询

select to_date(LN_MAT_DT,'dd/mm/YYYY') from Emp ; 

有人可以帮忙吗?

【问题讨论】:

  • 如果是日期数据类型,那么为什么要使用 to_date 来获取它。已经是约会了。只需使用select ln_mat_dt from emp
  • 绝不,永远不要在已经是日期的值上调用to_date()。这将首先将date 值转换为varchar,然后将varchar 转换回最初的date
  • OK 将使用直接获取列结果,我不会使用 to_char/to_date。它将返回 01-FEB-51。那么现在如何在屏幕上将其显示为 02/01/2051。
  • 要以您想要的格式显示数据,请在日期列上使用 to_char。或者为您的会话设置 nls_date_format 为 dd/mm/yyyy
  • 即使我更改了 nls_date_format,我仍然只得到 1951 年。

标签: database oracle date oracle11g


【解决方案1】:

这是关于您使用的格式掩码以及RRRRYYYY 之间的区别。看看下面的例子:

SQL> select to_date('01.02.51', 'dd.mm.yy') date_yy,
  2         to_date('01.02.51', 'dd.mm.rr') date_rr,
  3         --
  4         to_date('01.02.1951', 'dd.mm.yyyy') date_19_yyyy,
  5         to_date('01.02.1951', 'dd.mm.rrrr') date_19_rrrr,
  6         --
  7         to_date('01.02.2051', 'dd.mm.yyyy') date_20_yyyy,
  8         to_date('01.02.2051', 'dd.mm.rrrr') date_20_rrrr
  9  from dual;

DATE_YY    DATE_RR    DATE_19_YY DATE_19_RR DATE_20_YY DATE_20_RR
---------- ---------- ---------- ---------- ---------- ----------
01.02.2051 01.02.1951 01.02.1951 01.02.1951 01.02.2051 01.02.2051

SQL>

您应该做的是使用带有 YYYY 格式掩码的 4 位数年份。

【讨论】:

  • 我现在可能不会使用 YYYY 格式,因为它已经设计好了。只有当我像下面这样更改会话时,我才会得到 01.02.2051 的结果。更改会话集 nls_date_format = 'dd-mm-yyyy';但是当我从我的桌子上取东西时这仍然不起作用
  • 在我看来,问题出在您最初插入数据的时候。数据类型 DATE 总是 有 4 位数的年、长毛绒月、日、小时、分钟和秒。我敢打赌,您的 INSERT 没有指定 4 位数的年份。可能使用RR掩码。您的“已设计”存在致命缺陷。
  • 我没有拆分值,我将值作为 02/01/2075 传递。
【解决方案2】:

既然 LN_MAT_DT 是 DATE 数据类型,你需要 to_char,而不是 to_date,即:

select to_char(LN_MAT_DT,'dd/mm/YYYY') from Emp ; 

【讨论】:

  • 这不起作用。我无法更改数据库的设计或更改会话。有没有人有解决方案,请建议。
猜你喜欢
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 2020-08-11
相关资源
最近更新 更多