Tjena
Håller på och bygger om en sida som i dagsläget använder en Accessdatabas.
Flytten kommer ske till MySQL och har dykt på lite problem med datumformateringen i en SQL-Fråga.
Såhär ser frågan ut i Access: (Hämtar ut det jag vill ska hämtas)
q = "SELECT YEAR(gStartDate) AS ar, MONTH(gStartDate) AS man, lName, gId, gName, gDayTime, gStartDate, gPlace, gTrainer, gTrainer2 " &_
"FROM tbl_sSchool_levels sl INNER JOIN tbl_sSchool_groups sg " &_
"ON sl.lId = sg.lId " &_
"WHERE YEAR(sg.gStartDate) = YEAR(NOW()) " &_
"AND DATEDIFF('m', sg.gStartDate, NOW()) < 4 " &_
"ORDER BY 2 DESC, 1 DESC, sl.sOrder ASC, sg.sOrder ASC"
Såhär har jag gjort för att få samma resultat i MySQL:
q = "SELECT EXTRACT(YEAR FROM gStartDate) AS ar, EXTRACT(MONTH FROM gStartDate) AS man, lName, gId, gName, gDayTime, gStartDate, gPlace, gTrainer, gTrainer2 " &_
"FROM tbl_sSchool_levels sl INNER JOIN tbl_sSchool_groups sg " &_
"ON sl.lId = sg.lId " &_
"WHERE EXTRACT(YEAR FROM sg.gStartDate) = EXTRACT(YEAR FROM CURDATE()) " &_
"AND DATEDIFF(EXTRACT(MONTH FROM sg.gStartDate), EXTRACT(MONTH FROM CURDATE())) < 4 " &_
"ORDER BY 2 DESC, 1 DESC, sl.sOrder ASC, sg.sOrder ASC"
Men med ovanstående fråga hämtas inget alls ut, utan det blir rs.EOF
Är det något jag glömt?
Tack!
Peter SMedlem sedan dec. 20025 483 inlägg q = "SELECT YEAR(gStartDate) AS ar, MONTH(gStartDate) AS man, lName, gId, gName, gDayTime, gStartDate, gPlace, gTrainer, gTrainer2 " &_
"FROM tbl_sSchool_levels sl INNER JOIN tbl_sSchool_groups sg " &_
"ON sl.lId = sg.lId " &_
"WHERE YEAR(sg.gStartDate) = YEAR(NOW()) " &_
"AND MONTH(CURDATE()) - MONTH(sg.gStartDate) < 4 " &_
"ORDER BY 2 DESC, 1 DESC, sl.sOrder ASC, sg.sOrder ASC"
Funkar kanon!
Tack, men varför funkar inte DateDiff på samma sätt?
Har kollat just tid / datum referensen för MySQL noga och upptäckt att man inte kan ange vilken typ av "sak" (timmar, minuter osv.) man vill ha resultatet i.
Tjena igen
Nu har jag ett liknande problem igen, så postar i den här tråden istället.
Jag ska med följande fråga plocka ut fakturor som förfallit, alltså där fakturadatum + förfallodagar <= dagens datum.
Har gjort såhär:
sSql = "SELECT " &_
"t1.nId, t1.gId AS anm_gId, t1.nName, t1.nPersNum, t1.nAnmTime, t1.nAnmQueued, t1.rec_magic_num, t1.fakt_date, t1.fakt_forfallo, t1.bet_date, " &_
"t2.gId AS gru_gId, t2.lId, t2.gName, t2.gDayTime, t2.gStartDate, t2.gEndDate, t2.gPlace, t2.gPrice " &_
"FROM tbl_sSchool_notifications t1 INNER JOIN tbl_sSchool_groups t2 " &_
"ON t1.gId = t2.gId " &_
"WHERE EXTRACT(DAY FROM t1.fakt_date) + t1.fakt_forfallo <= EXTRACT(DAY FROM CURDATE()) " &_
"[b]...[/b] " &_
"ORDER BY t2.lId ASC, t2.gId ASC, t1.nAnmTime ASC"
Där den fetstilta raden med punkterna är måste jag få in en kontroll på en kolumn som heter bet_date, denna kolumn får inte vara ett datum.
Tidigare i Access så använde jag mig av ...AND isDate(bet_date) men det verkar inte finnas något sådant i MySQL..?
Skulle behöva lösa det här, tack för att alla förslag!
Peter SMedlem sedan dec. 20025 483 inlägg Red./
AND coalesce(date(bet_date), null) is null
Aha, sorry.
Fältet är av typen datetime och eftersom jag exporterat databasen från Access så kan de fält som redan existerar innehålla tex. NULL.
Men de nya poster som skapas innehåller som default 0000-00-00 00:00:00.
Därför hade det varit bra med en funktion liknande IsDate() i Access.
Men jag ska prova det som står ovan, tack!
Fungerar fint, tack!