我想在oracle的日期字段中插入日期时间。到目前为止,我一直使用sysdate,它工作得很好,但是我需要使用相同的时间戳作为其他东西。
有谁知道如何创建与oracle的日期字段兼容的日期时间变量?我尝试的一切都会导致错误。
我尝试过各种变化:
Dim timestamp As DateTime = CDate(Now.ToString("yyyy/MM/dd HH:mm:ss"))
.......more code....
insertBuilder.Append("date = to_date(" & timestamp & ")")
答案 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涵盖了我所拥有的同样的基础,并以示例的方式更多。