Autor Zpráva
mitr
Profil
Řeším teď takový "oříšek".
Potřebuju udělat seznam dnů za posledních 30 dnů,
když uvedu příklad bude to asi nejjednodušší:

'05.01.2007'
'04.01.2007'
'03.01.2007'
'02.01.2007'
'01.01.2006'
'31.12.2006'
'30.12.2006'
'29.12.2006'
'28.12.2006'
'27.12.2006'
'26.12.2006'
'25.12.2006'
'24.12.2006'
'23.12.2006'
'22.12.2006'

Nejde mi o formátování atd, ale prostě jak získat tento seznam z "ničeho" ?
Nechci vybírat z žádné tabulky, potřebuju prostě jen vytvořit takovýto seznam a dále s ním budu pracovat ....
Když chci nějak sečíst datumy, použiju INTERVAL, ale když chci tento seznam, tak mě nic nenapadá, procházel jsem diskusi v manuálu MySQL a taky nic.
Předem díky za nápady ;-)
Casero
Profil
mitr
Moc nechápu, kde je problém?...stačí ti zjistit jaký je den dnes a z toho už lehce dostaneš minulých 30...
mitr
Profil
Casero
Asi si sedím na vedení,ale fakt nevím ... to co jsem nahoře napsal, tak chci jako výsledek dotazu ...
tiso
Profil
mitr
Chceš získať z DB iba zoznam posledných 30 dní? Alebo aj niečo iné?
Casero
Profil
mitr
No newím, jak seš na tom v php...ale třeba fci date si vybereš dnešní datum v tom svéím formátu takže date("d.m.Y",Time()); no a pak od fce Time odečítáš jen 24 hodin (60*60*24)...de to i jednodušeji, ale nějak se mi nece hledat
mitr
Profil
Asi jsem to úplně nevysvětlil, já to nechci tahat do PHP, potřebuju udělat SELECT, který mi přesně toto vrátí, já k tomu potom vyberu další hodnoty unionem spojím určitý počet (nebo na JOINuju pokud to půjde) a do aplikace chci vráti už jen data pro vykreslení na graf, v aplikaci s tím nechci nic "čachrovat" :-)))
Jen dodám, že z dat, která mám a která všelijak spojuju tyto informace nedostanu (GROUP BY...) nebosahují totiž všechny dny.
mitr
Profil
Tak jsem to teď zkoušel a napadlo mě jak by to šlo, ale je to příšerná věc :)))) a hlavně nejde lehce měnit počet dnů :-/
Tohle není ta správná cesta, ale jen chci ukázat jaký výsledek mě zajímá :-)


SELECT date_format(NOW(),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 1 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 2 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 3 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 4 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 5 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 6 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 7 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 8 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 9 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 10 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 11 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 12 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 13 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 14 DAY),'%d.%m.%Y')
UNION SELECT date_format(DATE_SUB(NOW(), INTERVAL 15 DAY),'%d.%m.%Y')
tiso
Profil
mitr
Ak som to teda pochopil chceš zoznam dní z DB i keď tam niektorý deň nie je? Pripadá Ti to logické? Mne nie... Môžeš si vytvoriť zoznam dní v PHP a potom ho použiť ako vstup pre selekt z databázy, alebo môžeš vybrať z DB údaje o dňoch ktoré tam sú a prázdne hodnoty ošetriť v PHP...
mitr
Profil
tiso
No logické to je pokud chceš seznam všech dnů a u dnů pro které nejsou záznamy chceš 0.
Připadá mi elegantnější dostat takový výsledek už přímo z databáze. Jasně že by to šlo řešit např. v PHP, ale jak jsem psal, dostat to přímo z DB mi připadá elegantnější ;-)
Casero
Profil
mitr
Sem to chápal trošku jinak kvůli ->Nechci vybírat z žádné tabulky
nightfish
Profil
mohlo by to jít (u mySQL 5) pomocí nějaké uložené procedury možná
mitr
Profil
nightfish
Ještě jsem zapomněl dodat, potřebuju aby to šlo i u 4.1
No asi to vyřeším tím co jsem psal, je to prasárna, ale rychlost to nijak neovlivňuje :-)
shmoula
Profil
Ahoj,
asi už je to trochu pasé, ale narazil jsem na zajímavou metodu, jak tohohle docílit. Já sám jsem před nějakou dobou zkoumal, jak nechat MySQL generovat řádky, třeba jako pokusnou sadu. Našel jsem akorát jeden způsob pomocí uložených procedur ( http://www.linuxsoft.cz/article.php?id_article=1010 , tam vlastně řeší přímo tvůj problém 30 dnů). Až teď jsem náhodou našel tohle:

Jenom si jednou vytvoříš tabulku čísel od 0 do 9:

CREATE TABLE integers (i INTEGER PRIMARY KEY)
INSERT INTO integers (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)

S pomocí této tabulky můžeš vytvořit libovolné množství řádků. Třeba od 0 do 999:


SELECT (hundreds.i * 100) + (tens.i * 10) + units.i AS iii
FROM integers AS units
CROSS JOIN integers AS tens
CROSS JOIN integers AS hundreds


No a z toho už se snadno vytříská tvých 30 dnů zpátky:

[edit: Původně jsem to napsal s vnějším selectem, až potom jsem si uvědomil, že to jde bez něj. To původní mažu.]

SELECT DATE_SUB(CURDATE(), INTERVAL ((tens.i * 10) + units.i) DAY) AS datum
FROM integers AS units
CROSS JOIN integers AS tens
LIMIT 0, 30

(Zdroj: http://www.xaprb.com/blog/2005/12/07/the-integers-table/ )
Toto téma je uzamčeno. Odpověď nelze zaslat.