1) Вы строите запрос, который не использует переменные связывания?Или вы вручную заполняете переменные связывания в своем отладочном выводе для нас?Если вы не используете переменные связывания, вы реально создадите огромную проблему с производительностью в своей базе данных, потому что собираетесь разрушить общий пул Oracle.Вы собираетесь создать небезопасный код, уязвимый для атак с использованием SQL-инъекций.И в конечном итоге вы потратите много времени на изучение проблем, связанных с типами данных, экранированием строк и т. Д.
Если бы вы использовали переменные связывания, вы просто создали бы локальные переменные даты в своем VB.Чистое приложение, свяжите их с вашим запросом, и все будет в целом работать.Это было бы намного эффективнее, поскольку Oracle нужно было бы только выполнить жесткий анализ оператора один раз и не заполнять общий пул аналогичными операторами, когда вы снова и снова выполняете запрос с разными датами.
IЯ не разработчик VB.Но если вы используете переменные связывания, вы бы заменили литералы в вашем операторе SQL на заполнители, т.е.
AND TDM_END_TIME >= :early_time
AND TDM_END_TIME < :late_time
AND TDM_STATUS <> :status_1
AND TDM_STATUS <> :status_2
Затем вы предоставили бы значения для этих переменных связывания во время выполнения, то есть
flowQueryCMD.Parameters.Add( ":early_time", <<your VB date object>> )
flowQueryCMD.Parameters.Add( ":late_time", <<your VB date object>> )
Наконец, вы выполняете запрос
2) Если вы не используете переменные связывания, вы должны убедиться, что ваши типы данных совпадают.'01-Jan-2009 '- это строка, а не дата, поэтому Oracle должна неявно преобразовать строку в дату.Это делается с помощью сеанса NLS_DATE_FORMAT
.Если ваш NLS_DATE_FORMAT
окажется не «DD-MON-YYYY», преобразование не будет выполнено (или произойдет что-то неожиданное), и вы не получите ожидаемых результатов.Поскольку NLS_DATE_FORMAT
может отличаться для каждого сеанса, вам никогда не нужно полагаться на какой-либо конкретный NLS_DATE_FORMAT
, установленный в каком-либо конкретном сеансе, в противном случае ваш код может работать для вас и не работать для вашего коллеги, который предпочитает европейские форматы дат.Ваш код может нормально работать в одном сеансе (скажем, SQL * Plus, который получает NLS_DATE_FORMAT
из одного места), а не в другом сеансе (скажем, приложение .Net, которое получает свой язык, набор символов и настройки формата датыиз стека .Net)
Существует несколько способов указать литералы даты в Oracle.Во-первых, использовать синтаксис литерала даты ANSI (или метки времени) (обратите внимание, что литералы даты ANSI всегда указываются как ГГГГ-ММ-ДД)
AND tdm_end_time >= date '2009-01-01'
AND tdm_end_time < date '2009-05-31'
Второй вариант - выполнить явное преобразование самостоятельноиспользуя TO_DATE
функцию
AND tdm_end_time >= to_date( '01-Jan-2009', 'DD-MON-YYYY' )
AND tdm_end_time < to_date( '31-May-2009', 'DD-MON-YYYY' )