0

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

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

我已经尝试过这样的变化:

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

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

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

2 回答 2

3

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

Dim timestamp As Date = Date.Now

请注意,在 VB.NET 中,Date是 的缩写,DateTime就像.IntegerInt32

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

于 2013-02-26T16:59:51.127 回答
1

参数化查询是一个好的开始,因为您可以将本机 .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 服务器的默认日期格式,但由于我们必须部署到我们无法控制的客户端服务器,因此我们使用此方法。

本文涵盖了与我刚刚拥有的相同的基础,并以示例的方式提供了更多内容。

于 2013-02-26T17:10:40.407 回答