search by date

16 отговора 785 прегледа
#1

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.

Отговор
в отговор на lvo #2

Защо са ти 3 полета за дата?

Ако е едно - нямаш проблем ама 3?
Сигурно и сега има някакъв чалъм да направиш ненужно сложна заявка която първо да направи едно поле от трите пък после да сравнява, ама е малко над нивото ми :)))

Отговор
в отговор на lvo #3

Re: search by date

Използвай едно DATE поле, вместо 3.

Иначе винаги можеш да използваш DATE_FORMAT(CONCAT(year,'-',mont,'-',day), '%Y-%m-%d'), за да получиш желаното поле, но е тъпо така.

Everything louder than everything else...
Отговор
в отговор на bira_more #4

Re: Има Защо

Представи си, че често ти трябват заявки в стил

... WHERE month = 3;

salle.online.bg/sig
Отговор
в отговор на Dakota #5

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 години, ще стане зле.

Отговор
в отговор на salle #6

Сигурно си прав ама ...

ако ми трябва
WHERE month = 3
сигурно ще ми свърши работа и
WHERE mydate like '200303%'
Мисълта ми е че ако ми трябва нещо за даден месец то обикновено е от дадена година*
Пък ако ти трябват и двете често - нарушаваш правилата и си правиш 4 полета :)
Де да знам - не ми е трябвало само месец (без година) не съм ровил.
________
* А съм сигурен цхе имаше чалъм да се изберат датите само по месец ама пак беше нещо през крив макарон:)

Отговор
в отговор на waflata #7

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
Отговор
в отговор на bira_more #8

Re: Сигурно си прав ама ...

WHERE mydate like '200303%'

Сигурно няма да ти свърши работа в общия случай!

Първо не е много хитро да конвертираш mydqte до стринг за да работи LIKE и второ защото така разчиташ на специфичен формат който пък за момемнта е такъв САМО за TIMESTAMP и то преди 4.1

В 4.1 заради съвместимост и стандартите TIMESTAMP връща същий формат като DATETIME по подразбиране.

Изобщо навика да работиш с дати и времена като със стрингове не е много читав. Ама никак.

salle.online.bg/sig
Отговор
в отговор на salle #9

Re: search by date

Ммдаа, имаш право. По-добре е.

Отговор
в отговор на salle #10

Mersi za TIMESTAMP инфото

По принцип като работя с дати часове и т.н. ползвам едно единствено нещо - double аз си имам грижа за конверсиите.
Въобще не смея да разчитам на някакъв стандарт - още от време оно съм брал ядове с BDE и например 1999 г. и BDE то е до там види ли си г. ....
От там на сетне аз си знам как да си подредя година месец ден а и съм си направил достатъчно рутини за конверсии, дисплей и т.н.
Зная че не е най-коректното решение, но BD са една част от дейността ми а основното са приложения които от време на време ползват BD
А ако има промени във формата на timestamp - май ме чакат ядове в бъдеще ;)
И никога нямам време да реша един проблем като хората в болшинството случаи все намирам време най-много да го заобиколя :(((

Отговор
в отговор на salle #11

Май така човек може

да си спести някоя и друга рутинка на C.
Наистина елегантно.

Отговор
в отговор на bira_more #12

Re: разбира се, че може ..

простички заявки от рода на ето тази:

DELETE FROM acct WHERE ts < NOW() - INTERVAL 3 MONTH;

навремето ми спестиха стотици редове на PHP


А можеш да правиш доста по интересни неща с функциите на MySQL от рода на

"Каква дата се пада неделята на текущата седмица?"

select curdate() + interval (7 - weekday(curdate())) day;

и никога никакви грижи с начало, край на месец, година и т.н.

salle.online.bg/sig
Отговор
в отговор на salle #13

Май съм одъртял доста :)

Лошото е че напоследък много трудно пробвам нови (за мен) неща особено ако не са ключово важни, а ако са ключово важни - тогава още по трудно :))
Гледам ги заявките и, е сигурно е че няма да ми трябват стотици редове код ама поне 10-20 (CBuilder).
Тъпото е и друго:
Гледам разни пособия (книжки, учебници) и там обжикновено има много малко точно такива високо ефективни примерчета.
Може би не съм попадал на подходящите книги (не че съм купувал много книги де :)
Макар че последните неща дето смъкнах са доста готини...
Мисля си че ако БД не са основната работа на човек - практика + малко теория от време на време вършат добра работа

Отговор
в отговор на salle #14

Re: Има Защо

За такива случаи си има datepart() .

Отговор
в отговор на lvo #15

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 ), и пр.

Отговор
в отговор на lele #16

Re: ако ... и ако ... абе въобще Зависи!

М твоя примерът всичко зависи от Годината. Ако си знаеш, че perform винаги е през "тази година" тогава

WHERE MONTH(perform) > x1 AND DAYOFMONTH(perform) > x2
може да се препише като

WHERE perform > "2003-01-02"

Ама в най-общия случай по-добрия вариант е да разбиеш датата на 3 колонки.

Пак се върнахме на
Универсалния Отговор На Всички Въпроси Свързани С Релационни Бази Данни:
- Ами Зависи....

salle.online.bg/sig

Редактирано от salle на

Отговор
в отговор на lvo #17

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,
то тогава това е глупост.

А най-доброто решение, както казаха колегите
е когото сървера си има тип за дата
да се използва той.

Отговор