将日期插入Oracle

时间:2013-02-26 16:50:38

标签: vb.net oracle

我想在oracle的日期字段中插入日期时间。到目前为止,我一直使用sysdate,它工作得很好,但是我需要使用相同的时间戳作为其他东西。

有谁知道如何创建与oracle的日期字段兼容的日期时间变量?我尝试的一切都会导致错误。

我尝试过各种变化:

Dim timestamp As DateTime = CDate(Now.ToString("yyyy/MM/dd HH:mm:ss"))

.......more code....

insertBuilder.Append("date = to_date(" & timestamp & ")")

2 个答案:

答案 0 :(得分:3)

首先,您似乎对DateTime对象与该String对象的格式化DateTime表示之间的差异感到困惑。 Now,或者甚至更好,DateTime.Now已经是DateTime对象,因此将其格式化为字符串然后解析字符串以将其恢复为{{1}是没有意义的价值再次。所以,你可以简单地做到这一点来完成同样的事情:

DateTime

请注意,在VB.NET中,Dim timestamp As Date = Date.Now 是一个Date缩写的关键字,就像DateTime的“Integer短”一样。

其次,您不应将Int32值直接附加到SQL命令字符串中。您应该使用参数化查询。将DateTime值附加到SQL字符串时,必须确保其格式正确(通过调用DateTime)。然而,不幸的是,哪种格式是正确的将完全取决于服务器的文化设置。因此,最好使用数据库参数,将参数值设置为等于实际的timestamp.ToString(...)对象,然后让数据库提供程序为您进行转换。

答案 1 :(得分:1)

参数化查询是一个很好的开始,因为您可以将本机.Net DateTime对象传递到Enterprise Library(例如)并指定它是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服务器的默认日期格式,但由于我们必须部署到无法控制的客户端服务器,所以我们使用此方法。

This article涵盖了我所拥有的同样的基础,并以示例的方式更多。