Goedemorgen allemaal,

Ik wil op een time-veld in mijn tabel een query loslaten waarbij ik een selectie maak op het onderdeel 'uur'.
Dit lukt me niet.
Ik heb de volgende query:


SELECT
    COUNT(ss.id) AS aantal
FROM
    sys__agenda AS ss
WHERE
    substr(ss.aanvang,0,2) = 10


In bovenstaande query wil ik het aantal items tellen dat begint tussen 10:00 en 10:59 uur.
Het resultaat = 0 terwijl er 8 records in mijn tabel staan die een aanvangstijd tussen de genoemde periode hebben.

Waar ga ik de mist in??

George

Toevoeging op 05/03/2014 09:54:11:

Oh ja,
Het veld aanvang in mijn tabel is van het type time
WHERE
HOUR(ss.aanvang) = 10
Let op dat filteren op velden die binnen een functie staan altijd een full table scan opleveren.
Dus dan is het beter om:
 WHERE ss.aanvang BETWEEN '10:00:00' AND '10:59:59'

te doen.
Ger,

Kun jij mij uitleggen waarom ik jouw voorkeur moet gebruiken boven die van Michael?
Volgens mij is de uitkomst bij beiden gelijk.
Overigens heb ik de query alsvolgt gebruikt:

<?php
sql = "SELECT
            COUNT(IF(HOUR(aanvang) = 00,'Ja',NULL)) AS uur0,
            COUNT(IF(HOUR(aanvang) = 01,'Ja',NULL)) AS uur1,
            COUNT(IF(HOUR(aanvang) = 02,'Ja',NULL)) AS uur2,
            COUNT(IF(HOUR(aanvang) = 03,'Ja',NULL)) AS uur3,
            COUNT(IF(HOUR(aanvang) = 04,'Ja',NULL)) AS uur4,
            COUNT(IF(HOUR(aanvang) = 05,'Ja',NULL)) AS uur5,
            COUNT(IF(HOUR(aanvang) = 06,'Ja',NULL)) AS uur6,
            COUNT(IF(HOUR(aanvang) = 07,'Ja',NULL)) AS uur7,
            COUNT(IF(HOUR(aanvang) = 08,'Ja',NULL)) AS uur8,
            COUNT(IF(HOUR(aanvang) = 09,'Ja',NULL)) AS uur9,
            COUNT(IF(HOUR(aanvang) = 10,'Ja',NULL)) AS uur10,
            COUNT(IF(HOUR(aanvang) = 11,'Ja',NULL)) AS uur11,
            COUNT(IF(HOUR(aanvang) = 12,'Ja',NULL)) AS uur12,
            COUNT(IF(HOUR(aanvang) = 13,'Ja',NULL)) AS uur13,
            COUNT(IF(HOUR(aanvang) = 14,'Ja',NULL)) AS uur14,
            COUNT(IF(HOUR(aanvang) = 15,'Ja',NULL)) AS uur15,
            COUNT(IF(HOUR(aanvang) = 15,'Ja',NULL)) AS uur16,
            COUNT(IF(HOUR(aanvang) = 17,'Ja',NULL)) AS uur17,
            COUNT(IF(HOUR(aanvang) = 18,'Ja',NULL)) AS uur18,
            COUNT(IF(HOUR(aanvang) = 19,'Ja',NULL)) AS uur19,
            COUNT(IF(HOUR(aanvang) = 20,'Ja',NULL)) AS uur20,
            COUNT(IF(HOUR(aanvang) = 21,'Ja',NULL)) AS uur21,
            COUNT(IF(HOUR(aanvang) = 22,'Ja',NULL)) AS uur22,
            COUNT(IF(HOUR(aanvang) = 23,'Ja',NULL)) AS uur23
        FROM
            sys__agenda
        WHERE
            datum = '$dGekozenDatum'";
?>


En deze query levert mij precies op wat ik zocht.
Wellicht moet/kan ik deze nog aanpassen als ik jouw visie hierop hoor.
(Ik leer graag nog het e.e.a. ;-) )

George
Die van Ger zou iets sneller zijn. Dit merk je pas als je een grote tabel hebt. Misschien dat Ger het verder kan toelichten.
@George,
Een andere manier:

SELECT
	t.uur,
	COUNT(a.uur) AS aantal
FROM
	(SELECT
		@uur := @uur + 1 AS uur

	FROM
		mag_elke_tabelmet_min_24_rijen_zijn, (SELECT @uur := -1) uv
	LIMIT 24
	) t
LEFT JOIN
	(SELECT
		HOUR(aanvang) AS uur
	FROM sys__agenda
	WHERE datum = '$dGekozenDatum') a
ON t.uur = a.uur

Nu is deze manier wel wat trager, maar wel flexibel

@George (en) Michael
In het algemeen zet je een index je op kolommen waarop je vaak filtert, die je in join voorwaarden nodig hebt en/of waarop je sorteert.
Zodra je een functie over een kolom uitvoert, kan deze niet meer geïndexeerd worden, met als gevolg een full table scan.
"tabel" a lijkt alleen een kolom "uur" te hebben.

Dus probeer het eens met a.uur

Reageren