SQL между не работает - PullRequest
5 голосов
/ 12 мая 2011

У меня есть следующий оператор, выполняемый в базе данных оракула. ​​

SELECT br.Number
  FROM Billing_History br 
 WHERE TRUNC(br.History_Date) BETWEEN to_date('01-Jan-99', 'DD-Mon-YY HH:MI:SS') 
                                  AND to_date('11-May-99', 'DD-Mon-YY HH:MI:SS')

В этой таблице определенно есть записи, которые попадают между этими датами. И у всех них есть номер, который идет с ними, но по какой-то причине он не возвращает никаких номеров. Он вообще ничего не возвращает.

Даты в базе данных в этом формате '01 -Jan-11 '. Так что, похоже, я тоже выставляю даты в правильном формате. Видите ли вы что-то не так с написанным мной SQL?

Ответы [ 3 ]

11 голосов
/ 12 мая 2011

Проблема не в компоненте времени модели формата, а в компоненте «ГГ», что означает, что в вашем году конвертируется в 2099, а не в 1999. Попробуйте это для иллюстрации:

SQL> SELECT to_char(to_date('01-Apr-99','DD-Mon-YY'),'DD-Mon-YYYY') thedate
       FROM dual;

THEDATE
-----------
01-Apr-2099

SQL> 

Используйте RR или YYYY в качестве компонента модели формата для года при использовании дат 20-го века.

Редактировать:

Вы делаете заявление «Даты в базе данных имеют формат« 01-Янв-11 ».»Это обычная, но неверная интерпретация дат в Oracle.Поля DATE всегда хранятся в одном и том же внутреннем формате .Все дело в том, как вы используете модель формата в функциях преобразования, которая определяет, как данные преобразуются во внутренний формат или из него.

5 голосов
/ 12 мая 2011

Используйте RR в вашем формате даты вместо YY. Вероятно, эти даты берут как 2099 год, а не 1999 год.

SELECT br.Number FROM Billing_History br WHERE  
TRUNC(br.History_Date) BETWEEN to_date('01-Jan-99', 'DD-Mon-RR HH:MI:SS') 
AND to_date('11-May-99', 'DD-Mon-RR HH:MI:SS')
3 голосов
/ 12 мая 2011

Попробуйте удалить часть времени из второго to_date параметра:

to_date('11-May-99', 'DD-Mon-YY')

Или даже лучше:

to_date('11-05-1999', 'DD-MM-YYYY')

Это более надежно, так как не зависит от языка и нене нужно угадывать век.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...