например кто будет праздновать день рождения с 2011-01-06 по 2011-02-01
пришел только к решению перебором. склейка текущего года и месяцем и числом оригинальной даты, и проверкой входит ли она в between дат по которым ищем...
тоесть дата роджения к примеру 1985-01-30 склеиваем текущий год и оригинальную дату, получаем 2011-01-30 и проверяем входит ли она в промежуток Between 2011-01-06 AND 2011-02-01
но как-то это не кошерно, разбивать дату склеивать, переводить строку снова в дату.... у кого будет лучше вариант ?
Спустя 1 минута, 42 секунды (4.11.2011 - 06:52) jetistyum написал(а):
Если кого-то заинтересует, вот кусок запроса который я использую для поиска
SELECT * FROM table WHERE DATE(concat(year(now()), '-',month(`date`), '-', day(`date`))) between :startdate AND :enddate
Спустя 16 минут, 10 секунд (4.11.2011 - 07:08) imbalance_hero написал(а):
jetistyum
Не уверен, что будет быстрее, но можно сделать ещё через SUBSTR, то есть из date выбрать начиная с '01-01' по '02-03' , чтобы год не передавать.
Не уверен, что будет быстрее, но можно сделать ещё через SUBSTR, то есть из date выбрать начиная с '01-01' по '02-03' , чтобы год не передавать.
Спустя 3 минуты, 45 секунд (4.11.2011 - 07:12) jetistyum написал(а):
imbalance_hero
у тебя получается тот же принцип, по большому счету одно и тоже .... разрезать, склеить, сделать дату, сравнить...
у тебя получается тот же принцип, по большому счету одно и тоже .... разрезать, склеить, сделать дату, сравнить...
Спустя 5 минут, 25 секунд (4.11.2011 - 07:18) imbalance_hero написал(а):
jetistyum
Всмысле? Зачем склеивать и делать дату?
Вот всё просто:
Хотя возможно SQL их сам склеивает в итоге, хотя он может сравнивать как строки, а не дату.
Всмысле? Зачем склеивать и делать дату?
Вот всё просто:
SELECT *
FROM `test3`
WHERE SUBSTR(`date`,6) BETWEEN '11-02' AND '11-05'
Хотя возможно SQL их сам склеивает в итоге, хотя он может сравнивать как строки, а не дату.
Спустя 11 минут, 36 секунд (4.11.2011 - 07:29) imbalance_hero написал(а):
Но смотри, в обоих вариантах индексы не пошли, ни твой ни мой.
А что, если создать ещё одно поле float в БД, где будешь хранить месяц-день через точку, цифры: 11.02 , 11.05 , 12.12 , на него индекс можно повесить, и поиск, собственно, будет куда эффективнее.
А что, если создать ещё одно поле float в БД, где будешь хранить месяц-день через точку, цифры: 11.02 , 11.05 , 12.12 , на него индекс можно повесить, и поиск, собственно, будет куда эффективнее.
SELECT *
FROM `test3`
WHERE `datebrid`
BETWEEN '11.02'
AND '12.05'
Спустя 3 часа, 22 минуты, 38 секунд (4.11.2011 - 10:52) SlavaFr написал(а):
такие запросы не в состоянии использовать индехированные поля.
т.е база должна действительно пройти каждую строчку, соединить все цифры занося их в темп-таблицу и потом проверять соединенный стринг с другими ....
используй на прямую сравненния между месяцами и днями startdate и enddate при помощи month() и day()
т.е база должна действительно пройти каждую строчку, соединить все цифры занося их в темп-таблицу и потом проверять соединенный стринг с другими ....
используй на прямую сравненния между месяцами и днями startdate и enddate при помощи month() и day()
Спустя 31 минута, 49 секунд (4.11.2011 - 11:24) Семён написал(а):
А почему ты не хранишь в UNIX TIME?
Он сейчас корректно работает и с датами < 1970, просто будут отрицательные значения.
Никаких преобразований, только BETWEEN по Unix time + будут работать индексы при поиске
Он сейчас корректно работает и с датами < 1970, просто будут отрицательные значения.
strtotime("12.04.1965"); //RESULT -149050800
Никаких преобразований, только BETWEEN по Unix time + будут работать индексы при поиске
Спустя 5 часов, 22 минуты, 51 секунда (4.11.2011 - 16:46) jetistyum написал(а):
imbalance_hero
Дельный совет, не думал что between будет корректно работать с неполной датой!!! супер!
Семён
Вероятно ты не понял, но каким образом будет проходить поиск по датам без учета года, только месяц и день... ну или я тебя не понял, но как может помочь в этом случае Unix_timestamp
Дельный совет, не думал что between будет корректно работать с неполной датой!!! супер!
Семён
Вероятно ты не понял, но каким образом будет проходить поиск по датам без учета года, только месяц и день... ну или я тебя не понял, но как может помочь в этом случае Unix_timestamp
Спустя 46 минут, 54 секунды (4.11.2011 - 17:33) killer8080 написал(а):
Цитата (Семён @ 4.11.2011 - 11:24) |
А почему ты не хранишь в UNIX TIME? Он сейчас корректно работает и с датами < 1970, просто будут отрицательные значения. |
В php - да, а в мускуле - нет.
Такой запрос вернёт "0", вместо отрицательного числа
SELECT UNIX_TIMESTAMP( '1965-01-01' )
Спустя 3 часа, 22 минуты, 2 секунды (4.11.2011 - 20:55) Семён написал(а):
jetistyum
Да не, это я не понял смысла, забей вообщем лоханулся)
Да не, это я не понял смысла, забей вообщем лоханулся)
Спустя 1 час, 55 минут, 58 секунд (4.11.2011 - 22:51) jetistyum написал(а):
Семён
ну не надо уж такими словами, бывает со всеми, не страшно
ну не надо уж такими словами, бывает со всеми, не страшно
Спустя 1 час, 11 минут, 35 секунд (5.11.2011 - 00:03) imbalance_hero написал(а):
jetistyum
Там не неполная дата, а число в float А between как раз отлично с числами работает.
Или ты про первый случай? Там тоже не дата, а SUBSTR возвращает строку, и строка сравнивается с строкой. Сначала первый символ (0-1), потом второй (1-9), потом всегда дифис, обычное сравнение строк.
П.С. Ну я думаю, ты итак всё это уже понял, просто пояснил, вдруг кто-то другой читать будет
Там не неполная дата, а число в float А between как раз отлично с числами работает.
Или ты про первый случай? Там тоже не дата, а SUBSTR возвращает строку, и строка сравнивается с строкой. Сначала первый символ (0-1), потом второй (1-9), потом всегда дифис, обычное сравнение строк.
П.С. Ну я думаю, ты итак всё это уже понял, просто пояснил, вдруг кто-то другой читать будет
Спустя 23 часа, 10 минут, 13 секунд (5.11.2011 - 23:13) jetistyum написал(а):
imbalance_hero
вот тут не соглашусь, если сравнивать просто как строки, то between не вернула бы правильное вхождение
т.к. дата 02-30 лежит между 02-01 и 04-01 но если проводить отдельное сравнение, то 02 - лежит между 02 и 03, но 30 не лежит между 1 и 1
так что происходит именно дата-сравнение, с учетом месяца( более старшего разряда) я так думаю
вот тут не соглашусь, если сравнивать просто как строки, то between не вернула бы правильное вхождение
т.к. дата 02-30 лежит между 02-01 и 04-01 но если проводить отдельное сравнение, то 02 - лежит между 02 и 03, но 30 не лежит между 1 и 1
так что происходит именно дата-сравнение, с учетом месяца( более старшего разряда) я так думаю
Спустя 6 минут, 4 секунды (5.11.2011 - 23:19) imbalance_hero написал(а):
jetistyum
Мне кажется, тут надо попробовать создать varchar и попробовать самому. Логика подсказывает, что может нормально идти сортировка, хотя алгоритм сравнения...
Мне кажется, тут надо попробовать создать varchar и попробовать самому. Логика подсказывает, что может нормально идти сортировка, хотя алгоритм сравнения...
Спустя 10 дней, 10 часов, 24 минуты, 54 секунды (16.11.2011 - 09:44) Гость_вася написал(а):
ещё лучше будет разбить дату на 3 поля. Год. Месяц. День.
Спустя 5 дней, 19 часов, 7 секунд (22.11.2011 - 04:44) turrel написал(а):
Один из вариантов решения, чтобы избежать такого геморроя, так это хранить два отедльных поля: день date(z) и год date(y). Ну или UNIX time.
Спустя 50 секунд (22.11.2011 - 04:45) Guest написал(а):
Цитата ("Гость_вася ") |
ещё лучше будет разбить дату на 3 поля. Год. Месяц. День. |
Избыточно. Достаточно года и номера дня.