参数化查询是一个好的开始,因为您可以将本机.Net DateTime对象传递到企业库(例如)并指定它是DbType.DateTime
并让EL担心它。但是,如果你不能这么做,因为你没有使用EL或类似的东西,并且坚持使用发布在你的问题中的SQL字符串,那么你需要知道Oracle如何在内部处理日期,特别是关于格式。
使用SQL开发人员或SQLPLUS,执行以下命令:
Select To_Char(sysdate) from Dual;
所显示的格式是Oracle实例预计日期是如果你使用TO_DATE和Oracle将在TO_CHAR使用的格式。如果您在任何一个电话中都偏离该格式,那么您将遇到问题。然而,无论默认格式的使用,你可以通过在调用中指定它覆盖它:
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH:MI:SS';
:
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使用默认的隐
请注意,前面的说明仅更改执行的会话的默认。我们使用自定义格式在我们的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配置文件,但由于我们必须部署到我们无法控制的客户端服务器,因此我们使用此方法。
This article涵盖了我刚刚在示例中所做的更多一点。
为什么拿一个日期,转换为字符串,然后_back_日期?这只是不必要的工作。如果你使用参数化查询,你将不必经历这个麻烦! – 2013-02-26 16:52:30
我明白你的意思。上面的代码是糟糕的,但是对VB来说是新的,我还不知道更好。我想要做的就是创建一个日期时间/时间戳作为变量,并将其插入Oracle日期字段。 – Chris 2013-02-26 16:56:36
我编辑了你的标题。请参见“[应的问题包括‘标签’,在他们的头衔?(http://meta.stackexchange.com/questions/19190/)”,这里的共识是“不,他们不应该”。 – 2013-02-26 17:06:43