参数化查询是一个好的开始,因为您可以将本机 .Net DateTime 对象传递到企业库(例如)并指定它属于DbType.DateTime
并让 EL 担心它。但是,如果您不能这样做,因为您没有使用 EL 或类似的东西,并且坚持使用问题中发布的 SQL 字符串,那么您需要了解 Oracle 如何在内部处理日期,特别是在格式方面。
使用 SQL Developer 或 SQLPlus,执行以下命令:
Select To_Char(sysdate) from Dual;
如果您使用 To_Date 和 Oracle 将在 To_Char 中使用,显示的格式是您的 Oracle 实例期望日期的格式。如果您在任一调用中偏离该格式,那么您将遇到问题。但是,无论使用哪种默认格式,您都可以通过在调用中指定它来覆盖它:
Select To_Char(sysdate, 'YYYY/MM/DD HH:MI:SS') from Dual;
Select To_Date('2013/02/26 05:03:27', 'YYYY/MM/DD HH:MI:SS') from Dual;
您可以通过设置 NLS_DATE_FORMAT 参数来设置希望 Oracle 隐式使用的默认值:
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH:MI:SS';
请注意,前面的语句仅更改执行它的会话的默认值。我们在我们的 Oracle 系统中使用自定义格式,并确保我们在使用登录后触发器的所有会话中都能获得它:
create or replace TRIGGER NLS_Parameters_OnLogon AFTER LOGON ON SCHEMA BEGIN
-- This makes the database case insensitive for sorting and searching and sets the default date format for TO_CHAR and TO_DATE
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_COMP=LINGUISTIC';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_SORT=BINARY_CI';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY/MM/DD HH:MI:SS''';
End;
可以通过编辑一些 Oracle 配置文件来更改整个 Oracle 服务器的默认日期格式,但由于我们必须部署到我们无法控制的客户端服务器,因此我们使用此方法。
本文涵盖了与我刚刚拥有的相同的基础,并以示例的方式提供了更多内容。