我使用以下代码调用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
,现在可以正常运行:)
答案 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。如果需要,您还可以在每个会话的基础上覆盖这些设置。