Как может получиться, что этот SQL-запрос работает из Oracle SQL Developer, а не из кода? - PullRequest
1 голос
/ 23 декабря 2010

У меня есть следующий SQL-запрос, который прекрасно работает (возвращает несколько строк), когда я запускаю его из средства разработки Oracle Oracle:

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')

Кажется, он работает нормально (я получаю данные обратно). Любая подсказка, что не так с вышеуказанными критериями ??

Ответы [ 2 ]

5 голосов
/ 23 декабря 2010

Я отвечу на последнюю часть вашего обновления.

'01-Dec-10' - это строка. Это не свидание. Это не имеет ничего общего с датами. Нет, пока он не превратится в дату. Есть (насколько мне известно) три способа сделать это.

  1. Использовать TO_DATE ()
  2. Укажите литерал даты как date '2010-12-01', который всегда равен дате ГГГГ-ММ-ДД
  3. Положитесь на неявное преобразование даты с использованием настроек NLS (что вы делаете)

Если ваши настройки NLS 'DD-MON-RR', строка '01 -Dec-10 'будет преобразована в 2010-12-01 ( 1 декабря 2010 ). Если, с другой стороны, ваши настройки 'RR-MON-DD', они будут преобразованы в '2001-12-10' ( 10 декабря 2001 года ).

Я не знаю ваших настроек, и поскольку вы тоже этого не знаете, вы должны поступать правильно, то есть всегда явно использовать TO_DATE () или литералы даты.

3 голосов
/ 23 декабря 2010

Используйте литералы даты 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...