Oracle to_date过程有不同的结果

时间:2015-04-16 12:10:08

标签: oracle oracle-sqldeveloper

我使用以下代码调用Oracle过程:

begin
PPT2000_AGG_HOURLY.RUNDURATION_HOURLY(4, to_date('01112014', 'DDMMYYYY'), 20);
end;
/

我的问题是日期格式。在一台PC上,该程序使用日期01.11.2014 00:00的结果计算所有罚款。

在另一台PC(相同版本的Oracle SQL Developer)上,该过程返回 0表示计算和日期01.11.2014

所以在转换日期方面似乎有所不同,我不知道为什么。我尝试使用第三台PC并获得01.11.2014的返回。

提供正确结果的PC具有相同的操作系统(WIN7德语)和相同版本的Oracle SQL Developer。也是同一个Oracle数据库。

那怎么可能呢?

更新解决方案 感谢您的回答,我将NLS设置从DD.MM.RR更改为DD.MM.RR HH24:MI,现在可以正常运行:)

3 个答案:

答案 0 :(得分:3)

您应该在代码中处理显示格式,而不是依赖于客户端的NLS_DATE_FORMAT。您不能指望1000个用户在其基于GUI的客户端工具中更改其本地NLS设置。

日期没有格式。您看到的内容仅供显示,具体取决于客户端区域设置特定的NLS_DATE_FORMAT

NLS_DATE_FORMAT可以在不同级别覆盖。如果您不想依赖客户端的NLS设置,请始终使用带有所需格式掩码的 TO_CHAR ,以确保在个别声明级别覆盖 强>

请记住,对于显示DATE值,请始终使用所需格式的 TO_CHAR 。要进行日期算术,请使用 TO_DATE 将文字转换为DATE。

例如,

TO_CHAR(date_column, '<desired_format>')

它将覆盖语句级别的特定于语言环境的NLS_DATE_FORMAT。

有关更多理解,请参阅此similar answer

答案 1 :(得分:1)

如果你真的有一个不变的约会,那么使用Oracle DateTime literal。它每次都有效,它独立于NLS_DATE_FORMAT

begin
  PPT2000_AGG_HOURLY.RUNDURATION_HOURLY(4, DATE '2014-11-01', 20);
end;
/

答案 2 :(得分:0)

检查SQL Developer中的NLS首选项以查看是否存在不匹配。转到首选项 - &gt;数据库 - &gt; NLS。如果需要,您还可以在每个会话的基础上覆盖这些设置。