这个 SQL 查询怎么会在 Oracle SQL Developer 中工作而不是在代码中工作?
Posted
技术标签:
【中文标题】这个 SQL 查询怎么会在 Oracle SQL Developer 中工作而不是在代码中工作?【英文标题】:how can it be that this SQL Query work from Oracle SQL Developer but not from code? 【发布时间】:2010-12-23 12:53:51 【问题描述】:当我从 Oracle 的 SQL 开发人员工具运行以下 SQL 查询时,它运行良好(返回多行):
select * from [schema].[table] where resource_unique_name in ('abc123') and (slice_date >= '01-Nov-10') and (slice_date < '01-Dec-10')
但不知何故,下面的这段代码返回 0 条记录(没有错误,0 条记录):
OracleDataReader reader = new OracleDataReader();
const string CONNECTION_STRING = [myConnetionString];
connection.ConnectionString = CONNECTION_STRING;
connection.Open();
OracleCommand command = connection.CreateCommand();
command.CommandText = [same SQL as above];
OracleDataReader reader = command.ExecuteReader();
int rowCount = 0;
while (reader.Read())
rowCount++;
Console.Write(rowCount);
连接打开没问题,因为如果我硬编码不同的 SQL 查询,我会得到结果。
有什么理由可以让查询在 SQL 查询工具中正常工作,但不能来自我的 C# 代码??
更新说明: 在我的代码中,当我删除:
and (slice_date < '01-Dec-10')
它似乎工作正常(我取回数据)。任何线索上述标准有什么问题??
【问题讨论】:
您确定要连接到同一个数据库吗?是否定义了任何私有同义词?您是否以这种格式(dd-mon-yyyy
)传递硬编码的日期
看看这个类似的问题:***.com/questions/1534250/…
可能是 PLSQL 和您的应用程序使用不同的连接设置,从而导致(以及其他)不同的日期格式。但我预计在这种情况下会出错。尽管如此,使用参数而不是硬编码值是一件好事。
@GolezTrol - 我在问题中添加了一个新点,应该澄清这一点
依靠使用 NLS 参数的默认设置进行的隐式日期转换通常对您有用。如果对日期字符串使用 TO_DATE 函数会发生什么?
【参考方案1】:
我会回答你更新的最后一部分。
'01-Dec-10'
是一个字符串。这不是约会。它与日期无关。直到它被转换成日期。 (据我所知)有三种方法可以做到这一点。
-
使用 TO_DATE()
将日期文字指定为
date '2010-12-01'
,它始终是iso date YYYY-MM-DD
依靠使用 NLS 设置的隐式日期转换(您正在这样做)
如果您的 NLS 设置为 'DD-MON-RR'
,则字符串“01-Dec-10”将转换为 2010-12-01(2010 年 12 月 1 日)。另一方面,如果您的设置是 'RR-MON-DD'
,它将被转换为 '2001-12-10'
(2001 年 12 月 10 日)。
我不知道你的设置,既然你也不知道,你应该做正确的事,那就是始终明确地使用 TO_DATE() 或日期文字。
【讨论】:
当我尝试#2(在 Oracle SQL 开发人员内部)时,我收到一条错误消息:输入中的文字必须与格式字符串中的文字长度相同。这些设置是在客户端设置的吗?? @ooo:您需要在字面量之前添加date
关键字,如 Tony 的示例所示。没有它,它仍然会尝试使用您的默认日期格式来解释字符串,在 SQL Developer 中它似乎是 DD-MON-RR
。
@ooo,你把它写成 DATE '2010-12-01' 吗?
现在它与前面的“日期”一起使用。 .非常感谢您的帮助【参考方案2】:
使用 ANSI 日期文字,而不仅仅是日期值的字符串:
select * from [schema].[table]
where resource_unique_name in ('abc123')
and slice_date >= date '2010-11-01'
and slice_date < date '2010-12-01'
【讨论】:
以上是关于这个 SQL 查询怎么会在 Oracle SQL Developer 中工作而不是在代码中工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何设置让Oracle SQL Developer显示的时间包含时分秒