Go Back   Armenian Knowledge Base > Technical sections > Webmaster Zone > Web Development

Reply
 
Thread Tools

[Help Needed] SQL Request. Getting each day of date period.
Old 12.09.2007, 21:01   #1
инсценирующи
 
[ Xelgen ]'s Avatar
 
Join Date: 07 2002
Location: Fireplace of Ecotopia
Age: 39
Posts: 4,327
Rep Power: 5
Default [Help Needed] SQL Request. Getting each day of date period.

I have, a table containing events, and need to show them up in a calendar, for a month.

Here is the table I have.
Code:
1.
+------+--------------------+-------------------+------------+
|   id |         start_date |           end_date|      text  |
+------+--------------------+-------------------+------------+
|    1 | 2007-09-12 00:00:00|2007-09-12 23:59:59| Party      |
|    2 | 2007-09-13 00:00:00|2007-09-13 23:59:59| Concert    |
|    3 | 2007-09-13 00:00:00|2007-09-17 23:59:59| Festival   |
|    4 | 2007-09-15 00:00:00|2007-09-15 23:59:59| Exhibition |
|    5 | 2007-09-16 00:00:00|2007-09-16 23:59:59| Shooting   |
+------+--------------------+-------------------+------------+
I'd like to get, smth like.

Code:
2
+------+-----------+
|  day |    Text   |
+------+-----------+
|    12| Party     |
|    13| Concert   |
|    13| Festival  |
|    14| Festival  |
|    15| Festival  |
|    15| Exhibition|
|    16| Festival  |
|    16| Shooting  |
|    17| Festival  |
+------+-----------+
Do you have ideas, how this can be done?
Order, doesn't really matter, currently. So you can ignore, this as well as the time part of DATETIME.

Ideally, I need, to get, smth like :

Code:
 3
+------+--------------------------+
|  day |    Text                  |
+------+--------------------------+
|    12| Party                    |
|    13| Concert <br> Festival    |
|    14| Festival                 |
|    15| Festival <br> Exhibition |
|    16| Festival <br> Shooting   |
|    17| Festival                 |
+------+--------------------------+
But, I can do this with php, if i'd get the second table.

First table could also be done, through php, but I'd prefer to do it with MySQL, rather then processing "raw data" with PHP.
I'm sure this all can be done though MySQL, but i'm just out of ideas.
__________________
...ибо...
Rgrdz. [ Кселджэн ]

Old 13.09.2007, 12:21   #2
Главный Лысый
 
Pascal's Avatar
 
Join Date: 10 2001
Location: AM
Age: 47
Posts: 2,829
Rep Power: 5
Default

Поиграйся с group by dayofmonth(start_date).
Что то типа select dayofmonth(start_date), text group by dayofmonth(start_date)

Если нужна добавка и месяца то
select month(start_date), dayofmonth(start_date), text group by month(start_date), dayofmonth(start_date)


Должно работать для мускула. Про другие движки не знаю.
__________________
Ruben Muradyan
Technical Director
PanARMENIAN Network: Armenian News

----------------------------------------------------
Лысина - это полянка, вытоптанная мыслями.
----------------------------------------------------

Old 13.09.2007, 19:54   #3
инсценирующи
 
[ Xelgen ]'s Avatar
 
Join Date: 07 2002
Location: Fireplace of Ecotopia
Age: 39
Posts: 4,327
Rep Power: 5
Default

Сделал, это через пхп, так как дизайнеру, нужна была большая степень свободы в шаблоне, и там уже полюбому нужно было, лопатить массивы, так что делать это в двух местах глупо.

Но вопрос остается, тут загводка в том, как средствами ДБ из диапазона типа 2007-09-10 2007-09-15 получить, 6 строк, с датой каждого дня. тут как раз нужен какой-нибудь ungroup, а не group
Либо каким то еще макаром заставить выводить его, одну и ту же запись, несколько раз.
Остается еще изврат с созданием временной таблицы с перечнем всех дней месяца, но тут овчинка уже ни по одному критерию, не стоит выделки.
__________________
...ибо...
Rgrdz. [ Кселджэн ]

Old 13.09.2007, 22:38   #4
4294967296
 
Boyov's Avatar
 
Join Date: 03 2002
Location: /proc/1
Age: 40
Posts: 379
Rep Power: 0
Default

This should help I guess:

http://dev.mysql.com/doc/refman/5.0/en/regexp.html
__________________
Free your mind and your OS will follow

Old 14.09.2007, 04:33   #5
Младенец
 
Join Date: 06 2002
Location: Armenia, Yerevan
Posts: 34
Rep Power: 0
Lightbulb

Quote:
Originally Posted by [ Xelgen ] View Post
Сделал, это через пхп, так как дизайнеру, нужна была большая степень свободы в шаблоне, и там уже полюбому нужно было, лопатить массивы, так что делать это в двух местах глупо.

Но вопрос остается, тут загводка в том, как средствами ДБ из диапазона типа 2007-09-10 2007-09-15 получить, 6 строк, с датой каждого дня. тут как раз нужен какой-нибудь ungroup, а не group
Либо каким то еще макаром заставить выводить его, одну и ту же запись, несколько раз.
Остается еще изврат с созданием временной таблицы с перечнем всех дней месяца, но тут овчинка уже ни по одному критерию, не стоит выделки.
Ինչքան գիտեմ MySQL-ը նման խնդրի լուծման համար ստանդարտ մեթոդներ չունի.
Օրինակ MSSQL-ի մեջ ռեկուրսիվ կանչերով նման բան կարելի է սատանալ:
Համենայն դեպս MySQL-ի համար, ժամանակավոր table օգտագործելով կարելի է էդ խնդիրը լուծել, բայց թե որքանով է դա հարմար, կախված է քո պահանջներից:


Quote:
CREATE TABLE `t1` (
`id` int(11) NOT NULL auto_increment,
`d1` date NOT NULL,
`d2` date default NULL,
`event` varchar(20) default NULL,
PRIMARY KEY (`id`),
KEY `d1` (`d1`,`d2`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;


SET @v=0;
DROP TABLE IF EXISTS TMP;
CREATE TEMPORARY TABLE TMP(a int not null AUTO_INCREMENT,KEY(a));
INSERT INTO TMP VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0);

SELECT a.d1, a.event, 0 FROM t1 AS a
UNION
SELECT ADDDATE(a.d1, @v+1), a.event, @v:=@v+1
FROM t1 AS a
LEFT JOIN TMP AS T ON a.d1<>T.a AND @v<(a.d2-a.d1)
WHERE a.d1<a.d2;

--DROP TABLE TMP;

Old 17.09.2007, 03:41   #6
Академик
 
Join Date: 01 2002
Location: Shambala
Age: 46
Posts: 7,016
Rep Power: 6
Default

Rekurskia chka MySQL um ed hastat, ORacle um ka, MS SQL um el, baycMySQL um chka u ed nshanakuma ed xndri lucman hamar miak tarberak zamanakavor axusyaki ogtagorcumna
__________________
Ախպեր դու էմիգրացիան տուրիզմի հետ մի խառնի...

http://moskull.livejournal.com/

Old 12.11.2007, 21:35   #7
наивная дурочка
 
TasteMyLipstick's Avatar
 
Join Date: 10 2005
Location: бродяжка я
Age: 41
Posts: 196
Rep Power: 4
Default

Lorem ipsum dolor sit amet.
__________________
Я поняла, любовь - страна, Где каждый человек - притворщик.

Old 13.06.2008, 11:36   #8
Младенец
 
Join Date: 06 2008
Location: -
Posts: 3
Rep Power: 0
Default

Если вам так принципиально нужно сделать это в код SQL, используете MySQL версии 5 и выше. Этот сервер поддерживает хранимые процедуры.
В них доступны if/then/else, case, while, repeat, loop, goto
Напишите процедуру и вызывайте её.

Впрочем это будет работать медленее чем PHP. Подумайте насчет написать функцию PHP которая будет слоем абстракции между SQL вызовом и остальым кодом PHP. (Т.е. она тянет из БД данные, обрабатывает и выдает нужный вам массив).

Old 10.07.2008, 12:27   #9
Fox
Школьник
 
Fox's Avatar
 
Join Date: 11 2005
Location: AM
Posts: 178
Rep Power: 4
Default

v MSSQL est super vesh PIVOT ochen udobno budet dlia vivedenia
otcheta po dniam mesiaca esli eti dni iavliautsia stolbikami

naskolko ponial eto 2-aia chas zadania

temp table legko mojno ispolzovat v procedure
est 2 vida temp tableov

#table i @table
mejdu nimi bolshaia raznica

i mojno ispolzovat v razlichnikh procedurakh daje v rekursii
__________________
Если в слове "жена" сделать 4 ошибки, получится "пиво"

{Barracuda} Online Intellectual Games Club
http://www.Explorer.am - Explore Armenia!
Reply




Реклама:
реклама
Buy text link .

All times are GMT. The time now is 01:45.
Top

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.