webForumDet fria alternativet
Logga in / Bli medlem

Datumformatering i MySQL

Databaser & SQL

5 svar · 385 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

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!

Medlem sedan dec. 20025 483 inlägg
#2
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"
Medlem sedan feb. 20034 441 inlägg
#3

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.

Medlem sedan feb. 20034 441 inlägg
#4

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!

Medlem sedan dec. 20025 483 inlägg
#5

Red./

AND coalesce(date(bet_date), null) is null
Medlem sedan feb. 20034 441 inlägg
#6

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!

267 ms totalt · 4 externa anrop · v20260731065814-full.14655e19
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)