这个 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查询求助

Oracle中查询某字段不为空的SQL语句怎么写

如何设置让Oracle SQL Developer显示的时间包含时分秒

oracle里怎么对sql查询的日志进行查看

oracle 的问题 执行SQL查询语句 出现:部分多字节字符

sql 怎么查询每一年1到12个月的数据