Miten tehdään sql kysely (MySQL-tietokantaan), jossa rajoittavia tekijöitä ovat aloitus- ja lopetuspäivämäärä sekä aloitus- ja lopetuskellonajat?
Kyselyn pitäisi palauttaa aikavälin data.
Kellonaika tarkentaa annetun päivämäärien ajanhetkeä.
Perl-koodini, jossa sql query, mutta ei toimi:
$query = "SELECT * FROM $tableName WHERE (date>='$minDate' AND time>='$minTime') AND (date
Kyselyn pitäisi palauttaa aikavälin data.
Kellonaika tarkentaa annetun päivämäärien ajanhetkeä.
Perl-koodini, jossa sql query, mutta ei toimi:
$query = "SELECT * FROM $tableName WHERE (date>='$minDate' AND time>='$minTime') AND (date
Vastaukset 5
Vanhimmat
MySQL:ssä voi kyllä vertailla niitä aikoja ihan suoraan kuin vaikkapa numeroita jos aika on talletettu kantaan muodossa yyyymmddhhmmss, eli suurimmasta yksiköstä pienimpään. Voisi olla järkevämpää laittaa päivämäärä ja kellonaika kantaan samaan sarakkeeseen.
Oletko kokeillut kirjoittaa tuota SQL-lausettasi suoraan MySQL -ohjelmaan? Kokemus on minulla ainakin opettanut, että ensin kannattaa kirjoittaa toimi SQL-lause "kovakoodatuilla" eli kiinteillä arvoilla ja sitten kun se toimii niin korvata kiinteät arvot noilla muuttujilla.
Itse tietokannasta sen verran, että suositeltavaa voisi olla yrittää laittaa aika ja päivämäärä samaan sarakkeeseen (niinkuin tuossa aiempi kommentoija jo ehdottikin).
Ikävä kyllä en pysty laittamaan samaan sarakkeeseen tietoja, koska tietokantaan on alunperin tehty "date, time" eri sarakkeisiin ja tietokanta on tuollaisenaan käytössä. Joku konsti pitäisi keksiä...
Pääongelmana SQL lauseessani on, että "time" määritys rajoittaa dataa pois sellaiselta alueelta josta sen ei pitäisi sitä rajoittaa.
Esim. olkoon alku pvm: 2004-01-01, alku time: 00:00:00 ja loppu pvm 2004-01-03, loppu time: 12:00:00
SQL lauseeni palauttaa dataa päivämääriltä 01-03, jolloin kello on 00-12. (Oikeasti haluaisin koko datan annetusta kellonajasta aloituspäivänä aina lopetuspäivän kellon aikaan saakka.)
Kokeile jotakin tällaista. Ideana on, että haetaan erikseen ajat, jotka sijoittuvat annettujen päivämäärien väliin, sitten erikseen alkupäivämäärältä alkuajan jälkeen olevat ja vielä loppupäivämäärältä loppuaikaa ennen olevat ajat. Menee sen verran monimutkaiseksi, että tulet huomaamaan miten paljon kätevämpää ajat olisi olla samassa sarakkeessa. Anna piiskaa tietokannan suunnittelijalle :)
select * from table where (date > minDate and date < maxDate) or (date=minDate and time>=minTime) or (date=maxDate and time
Sain tietooni myös toisen vaihtoehdon, jolla ratkaista ongelma: päivämäärä- ja aikakenttä liitetään yhteen dynaamisesti SQL:n avulla, sitten tehdään normaali vertailu niinkuin aiemmin joku neuvoi. Nyt toimii :-), kiitoksia avusta.
$query = "SELECT * FROM $tableName WHERE CAST(CONCAT(date, CONCAT(' ', time)) AS DATETIME)>='$minDate $minTime' AND CAST(CONCAT(date, CONCAT(' ', time)) AS DATETIME)