Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Использование дат в WHERE-условии
 
 автор: diez   (15.08.2007 в 17:58)   письмо автору
 
 

Не сработывает запрос в одной из odbc совместимой БД:


SELECT name FROM clients WHERE bd BETWEEN 1972-01-01 AND  1975-01-01;


При этом запрос типа:

SELECT name FROM clients WHERE bd >=1972-01-01 ;


Заранее всем спасибо!

   
 
 автор: Trianon   (15.08.2007 в 19:44)   письмо автору
 
   для: diez   (15.08.2007 в 17:58)
 

Я всегда считал что 1972-01-01 будет равно 1972-2 равно 1970
, а в свою очередь 1975-01-01 будет равно 1975-2 равно 1973
Другими словами bd должно быть между 1970 и 1973

Не находите?

   
 
 автор: Ralph   (15.08.2007 в 20:31)   письмо автору
 
   для: Trianon   (15.08.2007 в 19:44)
 

Обьясняю ответ тов.Trianon :вы в запросе писали дату без кавычек,в результате это все обработалось как число 1975 минус число 01 и т.д. Надо взять дату
в одинарные кавычки...

[поправлено модератором]

   
 
 автор: oradev   (17.08.2007 в 13:06)   письмо автору
 
   для: Ralph   (15.08.2007 в 20:31)
 

Только вот так делать нельзя, если не хотим получить неявное преобразование строки в дату.

   
 
 автор: Ralph   (17.08.2007 в 13:31)   письмо автору
 
   для: oradev   (17.08.2007 в 13:06)
 

Значит,ни я,ни тов. Cheops неправы... Жаль... Ну тогда обьясните нам,как правильно ?

   
 
 автор: oradev   (17.08.2007 в 16:05)   письмо автору
 
   для: 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') выполняющая явное преобразование.

   
 
 автор: Trianon   (17.08.2007 в 21:59)   письмо автору
 
   для: oradev   (17.08.2007 в 13:06)
 

Для MySQL - способ, предложенный cheops'ом - абсолютно корректный.

   
 
 автор: oradev   (17.08.2007 в 22:20)   письмо автору
 
   для: Trianon   (17.08.2007 в 21:59)
 

TO Trianon: Любое неявное привидение типов нежелательно!
Ибо если есть индекс по дате какой-нить - то если условие селективное - все равно получим FULL SCAN по табличке

   
 
 автор: Trianon   (18.08.2007 в 01:03)   письмо автору
 
   для: oradev   (17.08.2007 в 22:20)
 

>TO Trianon: Любое неявное привидение типов нежелательно!
В принципе - да.

>Ибо если есть индекс по дате какой-нить - то если условие селективное - все равно получим FULL SCAN по табличке

Не получим. Разработчики MySQL не за красивые глаза выбрали восточный формат внешнего представления календарных данных. И не из любви к китайцам. А в первую очередь потому, что строковое представление и календарная временная сущность этого формата - функции монотонные. Для любых двух меток времени А и Б, таких что время наступления А раньше времени наступления Б -- строковое представление А также будет лексикографически меньше строкового представления Б, и наоброт.

Так что индекс вместо полного прохода можно использовать даже если написать
SELECT * FROM tbl WHERE LEFT(dt,4) BETWEEN 1966 AND 2007

   
 
 автор: oradev   (18.08.2007 в 19:20)   письмо автору
 
   для: Trianon   (18.08.2007 в 01:03)
 


 А в первую очередь потому, что строковое представление и календарная временная сущность этого формата - функции монотонные


Все проще значит, ну что уж ладно - можно курить трубку.

p.s. в Oracle такая беда не пройдет

   
 
 автор: Ralph   (18.08.2007 в 20:16)   письмо автору
 
   для: oradev   (18.08.2007 в 19:20)
 

Ну что поделаешь,все таки вверху страницы написано не "форум: БД"и не "форум: SQL""форум: MySQL" :-D

   
 
 автор: Trianon   (20.08.2007 в 00:41)   письмо автору
 
   для: oradev   (18.08.2007 в 19:20)
 

>p.s. в Oracle такая беда не пройдет

Что мне нравится в оракле куда больше, так это то, что время там не только монотонное, но и линейное, насколько я понимаю, на всей области определения.

   
 
 автор: cheops   (17.08.2007 в 10:51)   письмо автору
 
   для: 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';

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования