2011-12-05 75 views
1

我将C#代码中的日期(DateTime.Now)传递给Oracle过程。我想C#将日期传递给Oracle过程

DateTime.Now之间检索表中的所有值 - 1上午11点10分○○秒到DateTime.Now上午11时09分59秒

我怎样写一个oracle的条件本?

注:列“CREATEDATE”是一个日期

我现在有这个权利..

CreateDate >= TO_DATE(to_char(in_CreateDate), 'DD-MON-YY') - 1 
and CreateDate < TO_DATE(to_char(in_CreateDate), 'DD-MON-YY') + 1 

回答

1

你可以按照你的建议在日期进行数学运算。这里有一个简单的例子(可以替代你的DateTime.Now和适当的格式字符串,而不是我的硬编码为例):

SELECT TRUNC(TO_DATE('05-DEC-2011 05:31:32 PM', 'DD-MON-YYYY HH12:MI:SS PM')) 
    + 11/24 + 10/(24*60) AS MyDate FROM dual; 

MYDATE      
------------------------- 
05-DEC-11 11:10:00 AM  

注意我是如何走的输入日期,截断它(得到的日期没有时间),然后将小时和分钟添加到该基准日期。

您可以在此扩大使用BETWEEN关键字,得到这样的:

SELECT * FROM my_table 
WHERE CreateDate BETWEEN TRUNC(TO_DATE('05-DEC-2011 05:31:32 PM', 
    'DD-MON-YYYY HH12:MI:SS PM')) + 11/24 + 10/(24*60) - 1 
AND TRUNC(TO_DATE('05-DEC-2011 05:31:32 PM', 
    'DD-MON-YYYY HH12:MI:SS PM')) + 11/24 + 10/(24*60); 

或者,如果你总是传递DateTime.Now你可以只使用日期从数据库中:

SELECT * FROM my_table    
WHERE CreateDate BETWEEN TRUNC(sysdate) + 11/24 + 10/(24*60) - 1 
AND TRUNC(sysdate) + 11/24 + 10/(24*60); 
+0

有没有办法避免'TRUNC'? – CoolArchTek

+0

@CoolArchTek当然。只需省略日期的时间部分即可。或者甚至可以使用具有特定时间的DateTime对象(上午11:10)作为它的一部分。但是,如果你打算使用'DateTime.Now',你需要用你想要使用的特定时间替换(在调用时)捕获的时间。这可以通过'TRUNC()'或一个不捕获时间的格式字符串。 –

1

在甲骨文的默认 - 和+运营商的日期是用天。

(in_CreateDate-1)和(in_CreateDate + 1)之间的CreateDate应该有效。

如果问题是,你真的要在这一天创造的东西,但时间戳搞乱你,甲骨文 - 运营商默认情况下只着眼于天数,所以你可以使用

其中in_CreateDate-CREATEDATE = 0

(请注意,我通常使用SQL Server,所以我不能对此进行测试,这是基于阅读Oracle文档)

1

要管理Oracle日期时间我用的OracleCommand和参数。 例如:

SELECT * FROM Table WHERE Date >= :date 

使用的OracleCommand你可以这样做:

OracleCommand myOracleCommand = new OracleCommand("SELECT * FROM Table WHERE Date >= :date", myOracleConnection); 
myOracleCommand.Parameters.Add(":date", OracleDbType.DateTime).Value = myDate; 
... 

我觉得这是传递参数,因为Oracle提供了一组指令的转换查询和执行它在服务器上的最佳方式。

相关问题