За последние 24 часа нас посетили 16395 программистов и 1556 роботов. Сейчас ищут 1612 программистов ...

BETWEEN в mysql

Тема в разделе "MySQL", создана пользователем Mark32, 19 июн 2008.

  1. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    запрос

    [sql]
    ...та-та-та...
    WHERE date
    BETWEEN '19.03.08'
    AND '19.06.08'[/sql]

    выводит в итоге 0, хотя в таблице есть следующие например данные: 02.05.08, 04.05.08. Вопрос, почему? подскажите что делаю не так. Спасибо!

    ps У поля date аттрибут text
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А если дату в таком формате?
    [sql]19-03-2008[/sql]
     
  3. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    э-э-э формат даты мне не желательно менять.
    можно как-нибудь по иному?
     
  4. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Mark32
    А такой как у Вас разве есть формат даты в mysql?
     
  5. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    можно на лету конвертить :) ... но глупое решение :) .. даты надо хранить как даты .. ну или как даташтампы в интеджер ... а при конвертации слишком большие нагрузки могут возникнуть
     
  6. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    налету - можно. но только как в таком случае быть с требуемой операцией between - так задачка не решиться. да неважно мне в каком формате дата хранится. between должен работать не только с датами - но и данными. представим что это простые текстовые данные, которые нужно реализовать с... и по... только вот почему непонятно он не выдаёт - видимо ориентируется только по первому числу, а другие - игнорирует. что, реально больше ничего сделать нельзя?
     
  7. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Сравнение происходит в строковом контексте. А там 02.05.08 < 19.03.08.
     
  8. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    а если дату сохранить в mysql как дату, что, тогда в разных скриптах появиться возможность конвертировать по разному? Можно значит в одном скрипте извлеч в DD.MM.YY., а в другом скрипте - DD-MM-YYYY
    так?

    Если да, то
    1. какой аттрибут нужно поставить в поле date?
    ,
    2. какими командами можно будет конвертировать строки для выдачи в php?
    и
    3. в каком формате нужно будет "загонять" дату в это поле?

    Огромное спасибо за ответы!
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А системе важно. Вы программированием занимаетесь, а не копанием в песочнице.

    http://www.mysql.ru/docs/man/Date_and_t ... tions.html

    http://www.mysql.ru/docs/man/Date_and_time_types.html
     
  10. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    в mysql есть внутренняя функция DATE_FORMAT, она тебе вернет дату в том формате, в котором ты попросишь. и ты можешь даже не знать, как оно хранится на самом деле.
     
  11. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    спасибо, буду читать.
     
  12. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    премудрость блин. вот в oracle было бы всё проще...

    [sql]WHERE ORDER_DATE BETWEEN TO_DATE('01.11.1989','DD/MM/YYYY') AND TO_DATE('31.12.1989','DD/MM/YYYY')
    [/sql]
     
  13. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    В оракле TO_DATE - это функция. Напишите подобную для mysql...
     
  14. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
  15. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    господа, не могу сам разобраться в этой теме! Читал доки, ну нет в mysql команды between + дата как мне показалось. В доках рассказано как можно крутить датами - и так и сяк, а вот как извлеч тупо "с" и "по" не описано! То что between чувствителен к первой цифре/букве это ясно, но вот ума не приложу почему в mysql нет функции вывода данных "с" и "по" циклом и не по первой букве! Ведь у нас же в таблице есть данные, которые прикручены к своим id, и вот таким образом можно было бы извлечь все строки начинающиеся с например 01.01.08 до 01.006.08. Не понимаю почему такой функции нет.
    Да и философствовать на эту тему бесмыссленно - нет значит посчитали не включать по своим соображениям.
    объясните кому не сложно всё по конкретнее на те вопросы, чтобы наконец-то можно было мне сделать задуманное.
    Ну очень благодарен!
     
  16. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    с функциями мараться не хочеться - это одно что налету формировать данные.
    Лучше бы понять как формат даты переделать чтобы была возможность её свободной конвертации и самое главное извлечение "с" и "по"
     
  17. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Mark32

    храни дату в поле типа INT как unix_timestamp
     
  18. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    OK, а какой командой можно будет данные извлекать "с" и "по"?
     
  19. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    > < BETWEEN
    Это числа будут.
     
  20. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    на тему BETWEEN и дат, необходимо передавать дату в том же формате, в котором она хранится в БД (м.б. в mysql5 этого и не требуется, тестировалось на 4.1.16).

    м.б. можно предварительно приводить дату к передаваемому формату и в нем сравнивать, пробуйте;)

    [sql]
    -- ----------------------------
    -- Table structure for dates
    -- ----------------------------
    CREATE TABLE `dates` (
    `id` int(11) NOT NULL auto_increment,
    `date` date default NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    -- ----------------------------
    -- Records
    -- ----------------------------
    INSERT INTO `dates` VALUES ('1', '2001-01-01');
    INSERT INTO `dates` VALUES ('2', '2001-01-02');
    INSERT INTO `dates` VALUES ('3', '2001-01-03');
    INSERT INTO `dates` VALUES ('4', '2001-01-04');
    INSERT INTO `dates` VALUES ('5', '2001-01-05');
    INSERT INTO `dates` VALUES ('6', '2001-01-06');
    INSERT INTO `dates` VALUES ('7', '2001-01-07');
    INSERT INTO `dates` VALUES ('8', '2001-01-08');
    INSERT INTO `dates` VALUES ('9', '2001-01-09');
    [/sql]

    Код (Text):
    1. mysql> select `id` FROM dates WHERE date BETWEEN '01.01.2001' AND '05.01.2001';
    2. Empty set
    3.  
    4.  
    5. mysql> select `id` FROM dates WHERE date BETWEEN '2001-01-01' AND '2001-01-05';
    6. +--+
    7. | id |
    8. +--+
    9. | 1 |
    10. | 2 |
    11. | 3 |
    12. | 4 |
    13. | 5 |
    14. +--+
    15. 5 rows in set
    16.  
    17. mysql>  

    P.S. копируя запрос, помните, что тест проводился в консоли mysql, не забудьте удалить ";" в конце запроса ;)
     
  21. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    спасибо, сегодня всё попробую:)
     
  22. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    DarkElf, благодарю за детальную инструкцию. Всё похоже получилось.
    Вопрос такой. некоторые данные в таблицах если в phpmyadmin просматривать выглядят как
    Код (Text):
    1. & # 1089 ; & # 1086 ;
    - наделал пробелов, тк. если этого не сделать даже на форуме выдаст буквы "со"
    при этом всё нормально извлекается - никаких крякозябров нет.
    Это нормально? (всмысле то что некоторые данные приобретают такой вид?)
     
  23. Anonymous

    Anonymous Guest

    Mark32, значит, у базы кодировка не UTF8...
     
  24. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    ну это собственно неважно - извлекает в нормальной кодировке
     
  25. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    видимо, latin1, вроде как она идет кодировкой по-умолчанию.
    если данных немного, имхо, пересоздай базу данных