search by date
16 отговора
785 прегледа
search by date
Imam 4 poleta, event(varchar), year(int), mont(2) i day(2)
zapisite predstavliavat slednoto neshto:
'hello world', '2002', '2', '21'
triabva mi query s koeto moga da izvadia event predi/sled opredelena data.
zapisite predstavliavat slednoto neshto:
'hello world', '2002', '2', '21'
triabva mi query s koeto moga da izvadia event predi/sled opredelena data.
Защо са ти 3 полета за дата?
Ако е едно - нямаш проблем ама 3?
Сигурно и сега има някакъв чалъм да направиш ненужно сложна заявка която първо да направи едно поле от трите пък после да сравнява, ама е малко над нивото ми :)))
Сигурно и сега има някакъв чалъм да направиш ненужно сложна заявка която първо да направи едно поле от трите пък после да сравнява, ама е малко над нивото ми :)))
Re: search by date
Използвай едно DATE поле, вместо 3.
Иначе винаги можеш да използваш DATE_FORMAT(CONCAT(year,'-',mont,'-',day), '%Y-%m-%d'), за да получиш желаното поле, но е тъпо така.
Everything louder than everything else...
Иначе винаги можеш да използваш DATE_FORMAT(CONCAT(year,'-',mont,'-',day), '%Y-%m-%d'), за да получиш желаното поле, но е тъпо така.
Everything louder than everything else...
Re: Има Защо
Представи си, че често ти трябват заявки в стил
... WHERE month = 3;
salle.online.bg/sig
... WHERE month = 3;
salle.online.bg/sig
Re: search by date
ами добре де, защо не ги конверирасх само ВЕДНЪЖ вав дата, и после пишеш:
-----------------------------------------
SELECT event, event_date
FROM events
WHERE YEAR(event_date) = YEAR(NOW()) AND MONTH(event_date) = 3
ORDER BY event_date DESC
----------------------------------------
и така става, поне за mySQL трябва да бачка. Идеята е, че е добре да слагаш и годината защото ако имаш "events" от 2 години, ще стане зле.
-----------------------------------------
SELECT event, event_date
FROM events
WHERE YEAR(event_date) = YEAR(NOW()) AND MONTH(event_date) = 3
ORDER BY event_date DESC
----------------------------------------
и така става, поне за mySQL трябва да бачка. Идеята е, че е добре да слагаш и годината защото ако имаш "events" от 2 години, ще стане зле.
Сигурно си прав ама ...
ако ми трябва
WHERE month = 3
сигурно ще ми свърши работа и
WHERE mydate like '200303%'
Мисълта ми е че ако ми трябва нещо за даден месец то обикновено е от дадена година*
Пък ако ти трябват и двете често - нарушаваш правилата и си правиш 4 полета :)
Де да знам - не ми е трябвало само месец (без година) не съм ровил.
________
* А съм сигурен цхе имаше чалъм да се изберат датите само по месец ама пак беше нещо през крив макарон:)
WHERE month = 3
сигурно ще ми свърши работа и
WHERE mydate like '200303%'
Мисълта ми е че ако ми трябва нещо за даден месец то обикновено е от дадена година*
Пък ако ти трябват и двете често - нарушаваш правилата и си правиш 4 полета :)
Де да знам - не ми е трябвало само месец (без година) не съм ровил.
________
* А съм сигурен цхе имаше чалъм да се изберат датите само по месец ама пак беше нещо през крив макарон:)
Re: search by date
Защото фафла това е бавно.
WHERE YEAR(event_date) = YEAR(NOW()) AND MONTH(event_date) = 3
Не може да се е използва никакъв индекс за да се оптимизира тази заявка.
Докато същото нещо написано по друг начин може:
WHERE event_date BETWEEN DATE_FORMAT(CURDATE(), "%Y-03-01") AND DATE_FORMAT(CURDATE(), "%Y-04-01");
salle.online.bg/sig
WHERE YEAR(event_date) = YEAR(NOW()) AND MONTH(event_date) = 3
Не може да се е използва никакъв индекс за да се оптимизира тази заявка.
Докато същото нещо написано по друг начин може:
WHERE event_date BETWEEN DATE_FORMAT(CURDATE(), "%Y-03-01") AND DATE_FORMAT(CURDATE(), "%Y-04-01");
salle.online.bg/sig
Re: Сигурно си прав ама ...
WHERE mydate like '200303%'
Сигурно няма да ти свърши работа в общия случай!
Първо не е много хитро да конвертираш mydqte до стринг за да работи LIKE и второ защото така разчиташ на специфичен формат който пък за момемнта е такъв САМО за TIMESTAMP и то преди 4.1
В 4.1 заради съвместимост и стандартите TIMESTAMP връща същий формат като DATETIME по подразбиране.
Изобщо навика да работиш с дати и времена като със стрингове не е много читав. Ама никак.
salle.online.bg/sig
Сигурно няма да ти свърши работа в общия случай!
Първо не е много хитро да конвертираш mydqte до стринг за да работи LIKE и второ защото така разчиташ на специфичен формат който пък за момемнта е такъв САМО за TIMESTAMP и то преди 4.1
В 4.1 заради съвместимост и стандартите TIMESTAMP връща същий формат като DATETIME по подразбиране.
Изобщо навика да работиш с дати и времена като със стрингове не е много читав. Ама никак.
salle.online.bg/sig
Mersi za TIMESTAMP инфото
По принцип като работя с дати часове и т.н. ползвам едно единствено нещо - double аз си имам грижа за конверсиите.
Въобще не смея да разчитам на някакъв стандарт - още от време оно съм брал ядове с BDE и например 1999 г. и BDE то е до там види ли си г. ....
От там на сетне аз си знам как да си подредя година месец ден а и съм си направил достатъчно рутини за конверсии, дисплей и т.н.
Зная че не е най-коректното решение, но BD са една част от дейността ми а основното са приложения които от време на време ползват BD
А ако има промени във формата на timestamp - май ме чакат ядове в бъдеще ;)
И никога нямам време да реша един проблем като хората в болшинството случаи все намирам време най-много да го заобиколя :(((
Въобще не смея да разчитам на някакъв стандарт - още от време оно съм брал ядове с BDE и например 1999 г. и BDE то е до там види ли си г. ....
От там на сетне аз си знам как да си подредя година месец ден а и съм си направил достатъчно рутини за конверсии, дисплей и т.н.
Зная че не е най-коректното решение, но BD са една част от дейността ми а основното са приложения които от време на време ползват BD
А ако има промени във формата на timestamp - май ме чакат ядове в бъдеще ;)
И никога нямам време да реша един проблем като хората в болшинството случаи все намирам време най-много да го заобиколя :(((
Re: разбира се, че може ..
простички заявки от рода на ето тази:
DELETE FROM acct WHERE ts < NOW() - INTERVAL 3 MONTH;
навремето ми спестиха стотици редове на PHP
А можеш да правиш доста по интересни неща с функциите на MySQL от рода на
"Каква дата се пада неделята на текущата седмица?"
select curdate() + interval (7 - weekday(curdate())) day;
и никога никакви грижи с начало, край на месец, година и т.н.
salle.online.bg/sig
DELETE FROM acct WHERE ts < NOW() - INTERVAL 3 MONTH;
навремето ми спестиха стотици редове на PHP
А можеш да правиш доста по интересни неща с функциите на MySQL от рода на
"Каква дата се пада неделята на текущата седмица?"
select curdate() + interval (7 - weekday(curdate())) day;
и никога никакви грижи с начало, край на месец, година и т.н.
salle.online.bg/sig
Май съм одъртял доста :)
Лошото е че напоследък много трудно пробвам нови (за мен) неща особено ако не са ключово важни, а ако са ключово важни - тогава още по трудно :))
Гледам ги заявките и, е сигурно е че няма да ми трябват стотици редове код ама поне 10-20 (CBuilder).
Тъпото е и друго:
Гледам разни пособия (книжки, учебници) и там обжикновено има много малко точно такива високо ефективни примерчета.
Може би не съм попадал на подходящите книги (не че съм купувал много книги де :)
Макар че последните неща дето смъкнах са доста готини...
Мисля си че ако БД не са основната работа на човек - практика + малко теория от време на време вършат добра работа
Гледам ги заявките и, е сигурно е че няма да ми трябват стотици редове код ама поне 10-20 (CBuilder).
Тъпото е и друго:
Гледам разни пособия (книжки, учебници) и там обжикновено има много малко точно такива високо ефективни примерчета.
Може би не съм попадал на подходящите книги (не че съм купувал много книги де :)
Макар че последните неща дето смъкнах са доста готини...
Мисля си че ако БД не са основната работа на човек - практика + малко теория от време на време вършат добра работа
Re: search by date
здр. ще пиша в тази тема, понеже е сходна с това което искам да попитам
имам таблица в която една от колоните е тип date
id - smallint PRI
perform - date not null -> индексирана
по това поле perform ще се търси, като в идеалният случай ще имам:
WHERE perform BETWEEN 'xxxx-xx-xx' AND 'yyyy-yy-yy' - така ще се използва индекса, (аз лично трябва да благодаря на salle за това му предложение в един от отговорите по-горе)
В по-лошият случай обаче ще разполагам само с една от тези дати, а в още по-лошия - само с част от датата - месец или година или ден, или месец и ден например.
при което не виждам как ще стане с BETWEEN, а първото което ми хрумва е
WHERE MONTH(perform) > x1 AND DAYOFMONTH(perform) > x2
при което използването на индекса заминава ...
та въпроса ми е, дали има начин да се използва този индекс при горното положение, когато имам само част от датата. Могат да се срещнат всякакви комбинации от частите на двете дати, т.е. да имам например ден от първата и месец от втората ( DAYOFMOTNH(perform) > x1 AND MONTH(perform) < x2 ), и пр.
имам таблица в която една от колоните е тип date
id - smallint PRI
perform - date not null -> индексирана
по това поле perform ще се търси, като в идеалният случай ще имам:
WHERE perform BETWEEN 'xxxx-xx-xx' AND 'yyyy-yy-yy' - така ще се използва индекса, (аз лично трябва да благодаря на salle за това му предложение в един от отговорите по-горе)
В по-лошият случай обаче ще разполагам само с една от тези дати, а в още по-лошия - само с част от датата - месец или година или ден, или месец и ден например.
при което не виждам как ще стане с BETWEEN, а първото което ми хрумва е
WHERE MONTH(perform) > x1 AND DAYOFMONTH(perform) > x2
при което използването на индекса заминава ...
та въпроса ми е, дали има начин да се използва този индекс при горното положение, когато имам само част от датата. Могат да се срещнат всякакви комбинации от частите на двете дати, т.е. да имам например ден от първата и месец от втората ( DAYOFMOTNH(perform) > x1 AND MONTH(perform) < x2 ), и пр.
Re: ако ... и ако ... абе въобще Зависи!
М твоя примерът всичко зависи от Годината. Ако си знаеш, че perform винаги е през "тази година" тогава
WHERE MONTH(perform) > x1 AND DAYOFMONTH(perform) > x2
може да се препише като
WHERE perform > "2003-01-02"
Ама в най-общия случай по-добрия вариант е да разбиеш датата на 3 колонки.
Пак се върнахме на
Универсалния Отговор На Всички Въпроси Свързани С Релационни Бази Данни:
- Ами Зависи....
salle.online.bg/sig
WHERE MONTH(perform) > x1 AND DAYOFMONTH(perform) > x2
може да се препише като
WHERE perform > "2003-01-02"
Ама в най-общия случай по-добрия вариант е да разбиеш датата на 3 колонки.
Пак се върнахме на
Универсалния Отговор На Всички Въпроси Свързани С Релационни Бази Данни:
- Ами Зависи....
salle.online.bg/sig
Редактирано от salle на
Re: search by date
To Ivo.
Би било хубаво да кажеш кой е сървера.
Съдейки по изказванията на другите
е MySql.
После в:
event(varchar), year(int), mont(2) i day(2)
какво е това: "mont(2)" int ли или char?
Аз специално MySql не го познавам, може
и такава декларация да има - кой знае.
Ще допусна че всичките са int.
Тогава ако y,m,d са годината,месеца и
деня които те интересуват то:
select * from MyTable
where 10000*(year-y)+100*(mont-m)+(day-d)>0
ще ти върне датите по големи от дадената.
Като обърнеш знака '<0' то датите
по-малки от дадената.
Ако са char полетата тогава ги лепи
като низове година+месец+ден и сравнявай, НО
задължително да имаш водеща нула на
месеците и дните.
А ако year е int, а месеца и деня char,
то тогава това е глупост.
А най-доброто решение, както казаха колегите
е когото сървера си има тип за дата
да се използва той.
Би било хубаво да кажеш кой е сървера.
Съдейки по изказванията на другите
е MySql.
После в:
event(varchar), year(int), mont(2) i day(2)
какво е това: "mont(2)" int ли или char?
Аз специално MySql не го познавам, може
и такава декларация да има - кой знае.
Ще допусна че всичките са int.
Тогава ако y,m,d са годината,месеца и
деня които те интересуват то:
select * from MyTable
where 10000*(year-y)+100*(mont-m)+(day-d)>0
ще ти върне датите по големи от дадената.
Като обърнеш знака '<0' то датите
по-малки от дадената.
Ако са char полетата тогава ги лепи
като низове година+месец+ден и сравнявай, НО
задължително да имаш водеща нула на
месеците и дните.
А ако year е int, а месеца и деня char,
то тогава това е глупост.
А най-доброто решение, както казаха колегите
е когото сървера си има тип за дата
да се използва той.