|
|
|
| Не сработывает запрос в одной из odbc совместимой БД:
SELECT name FROM clients WHERE bd BETWEEN 1972-01-01 AND 1975-01-01;
|
При этом запрос типа:
SELECT name FROM clients WHERE bd >=1972-01-01 ;
|
Заранее всем спасибо! | |
|
|
|
|
|
|
|
для: diez
(15.08.2007 в 17:58)
| | Я всегда считал что 1972-01-01 будет равно 1972-2 равно 1970
, а в свою очередь 1975-01-01 будет равно 1975-2 равно 1973
Другими словами bd должно быть между 1970 и 1973
Не находите? | |
|
|
|
|
|
|
|
для: Trianon
(15.08.2007 в 19:44)
| | Обьясняю ответ тов.Trianon :вы в запросе писали дату без кавычек,в результате это все обработалось как число 1975 минус число 01 и т.д. Надо взять дату
в одинарные кавычки...
[поправлено модератором] | |
|
|
|
|
|
|
|
для: Ralph
(15.08.2007 в 20:31)
| | Только вот так делать нельзя, если не хотим получить неявное преобразование строки в дату. | |
|
|
|
|
|
|
|
для: oradev
(17.08.2007 в 13:06)
| | Значит,ни я,ни тов. Cheops неправы... Жаль... Ну тогда обьясните нам,как правильно ? | |
|
|
|
|
|
|
|
для: Ralph
(17.08.2007 в 13:31)
| | За всех не надо говорить
SELECT *
FROM emp
WHERE hiredate BETWEEN DATE '1980-04-02' AND DATE '1981-12-31';
|
С целью явного привидения типов лучше использовать ANSI совместимую date, либо
с помощью других функций преобразования строки в дату. Например, если речь идет о СУБД Oracle таковой является ф-ция to_date('01.02.1990','DD-MM-YYYY') выполняющая явное преобразование. | |
|
|
|
|
|
|
|
для: oradev
(17.08.2007 в 13:06)
| | Для MySQL - способ, предложенный cheops'ом - абсолютно корректный. | |
|
|
|
|
|
|
|
для: Trianon
(17.08.2007 в 21:59)
| | TO Trianon: Любое неявное привидение типов нежелательно!
Ибо если есть индекс по дате какой-нить - то если условие селективное - все равно получим FULL SCAN по табличке | |
|
|
|
|
|
|
|
для: oradev
(17.08.2007 в 22:20)
| | >TO Trianon: Любое неявное привидение типов нежелательно!
В принципе - да.
>Ибо если есть индекс по дате какой-нить - то если условие селективное - все равно получим FULL SCAN по табличке
Не получим. Разработчики MySQL не за красивые глаза выбрали восточный формат внешнего представления календарных данных. И не из любви к китайцам. А в первую очередь потому, что строковое представление и календарная временная сущность этого формата - функции монотонные. Для любых двух меток времени А и Б, таких что время наступления А раньше времени наступления Б -- строковое представление А также будет лексикографически меньше строкового представления Б, и наоброт.
Так что индекс вместо полного прохода можно использовать даже если написать
SELECT * FROM tbl WHERE LEFT(dt,4) BETWEEN 1966 AND 2007 | |
|
|
|
|
|
|
|
для: Trianon
(18.08.2007 в 01:03)
| |
А в первую очередь потому, что строковое представление и календарная временная сущность этого формата - функции монотонные
|
Все проще значит, ну что уж ладно - можно курить трубку.
p.s. в Oracle такая беда не пройдет | |
|
|
|
|
|
|
|
для: oradev
(18.08.2007 в 19:20)
| | Ну что поделаешь,все таки вверху страницы написано не "форум: БД"и не "форум: SQL",а "форум: MySQL" :-D | |
|
|
|
|
|
|
|
для: oradev
(18.08.2007 в 19:20)
| | >p.s. в Oracle такая беда не пройдет
Что мне нравится в оракле куда больше, так это то, что время там не только монотонное, но и линейное, насколько я понимаю, на всей области определения. | |
|
|
|
|
|
|
|
для: diez
(15.08.2007 в 17:58)
| | Исправьте запросы следующим образом
SELECT name FROM clients WHERE bd BETWEEN '1972-01-01' AND '1975-01-01';
SELECT name FROM clients WHERE bd >='1972-01-01';
|
| |
|
|
|