ugrás a tartalomhoz

hétköznapok és a mysql

therest · 2012. Jún. 1. (P), 09.27
Helló!

Megoldható-e tisztán, elegánsan mysqlben a következő probléma: van két oszlopom, date1, és date2 DATE típusúak. Amennyiben date2 valid, be kell másolni date1 helyére, amennyiben nem, akkor egy valid random dátumot kell bemásolni.
Date2, vagy a random dátum is csak akkor valid, ha az aktuális hónap valamely hétköznapjára esik.
Persze ezt is megcsináltam egy php szörnykóddal, de Ti tuti tudtok mondani valami ütős query-t amit szebb.


(+ valakinek nincs tippje a szerverek topicban feltett kérdésemhez? Eléggé elakadtam.)
 
1

UPDATE

janoszen · 2012. Jún. 1. (P), 09.49
Valami ilyesmit csinalnek:

UPDATE
    foo
SET
    date1=IF(
        DAYOFWEEK(date2)>1,
        IF(DAYOFWEEK(date2)<7,
            date2,
            DATE(FROM_UNIXTIME(ROUND(RAND()*UNIX_TIMESTAMP(NOW()))))
        ),
        DATE(FROM_UNIXTIME(ROUND(RAND()*UNIX_TIMESTAMP(NOW()))))
    )
A random datum generalo 1970-01-01 es a mai nap kozott fog egy datumot mondani. Ezt testre szabhatod a minta alapjan. A FROM_UNIXTIME() egy intet alakit timestampre, szoval oda barmilyen int tipusu egesz szamot beszurhatsz.

Arra figyelj, hogy a RAND() hasznalat ilyen formaban nem tudom, mennyire replication safe, szoval ha replikalt kornyezetben kell futnia, tedd be PHP-bol a random datumot. Ha most nem is fontos, mindenkeppen dokumentald le, kesobb fontos lehet.

Where feltetelt meg irj magadnak, amilyet szeretnel. :)
2

Köszi a választ, arra

therest · 2012. Jún. 1. (P), 10.23
Köszi a választ, arra sarkall, hogy az if-eket nézzem meg mysql doksiban (bár azt hiszem értem mit csinálsz, csak a szintaktika szokatlan), azonban ahhoz még lövésem sincs, hogy az aktuális hónap egy random hétköznapját hogyan kellene kiválasztanom.

A where ág nem kell, mert minden date1-et updatelni kell (egy cronal fut ez le havonta), de az if nem vizsgálja, hogy hogy az aktuális hónapban vagyunk-e, de gondolom ezt egy, az eddigieket körbefogó feltétellel meg tudom oldani.
3

IF

Hidvégi Gábor · 2012. Jún. 1. (P), 11.07
IF helyett inkább használj CASE-et, mert több adatbáziskezelő ismeri.
4

Egyébként, ha nem fogalmaztam

therest · 2012. Jún. 1. (P), 11.20
Egyébként, ha nem fogalmaztam volna teljesen tisztán: minden egyes rekordnál (ahol date2 nem valid) más random hétköznapot kellene kisorsolni (persze ettől lehetnek egyezésem de nem mind ugyanaz). Ezért egyetlen query-ből, nem működik az a módszer, hogy php-vel illesztek a query-be egy dátumot.
5

Stored procedure

janoszen · 2012. Jún. 1. (P), 13.27
Ha feltetlenul SQL-ben szeretned, akkor tolts fol hetkoznapokkal egy tablat, majd ahhoz kapcsolj date1-es rekordokat. Egy stored procedure-el menj vegig es egy sort updatelj egyszerre.
6

Nem szeretném feltétlenül

therest · 2012. Jún. 1. (P), 13.49
Nem szeretném feltétlenül sqlben, a külön tábla gondolata amúgy is elrémít (ezt folyton fel kellene tölteni adattal?), azt a módszert keresem, ami a legeffektívebb erre a problémára. Php alól csak úgy tudom elképzelni ezt, hogy előállítom a random dátumot, ami az aktuális hónapban van, és meg hétköznap is. Majd szépen minden adatbázis sorra meghívom az update query-t. Ez gondolom elég vacak, akár több ezer sor is szóba jöhet.

Arra is gondoltam, hogy php-ban előállítani egy listát, a lehetséges napokból (3,4,5,7,8,11,12,13,14...), és mysql-ben randomizálni ebből a listából, vagy megfordítva a gondolatot, átadni, hogy mely napok esnek hétvégére, és azok kivételével választani ki egy napot.

Sajnos nem ismerem kellőképpen a mysql eszközeit ahhoz, hogy ilyen elképzeléseket megvalósítsak, főleg nem úgy hogy az nem csak működik, hanem hatékony is. Ezért kérdezlek titeket. :)