Query op time-veld
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:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT
COUNT(ss.id) AS aantal
FROM
sys__agenda AS ss
WHERE
substr(ss.aanvang,0,2) = 10
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
HOUR(ss.aanvang) = 10
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?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'";
?>
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.
Een andere manier:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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.
Gewijzigd op 05/03/2014 17:26:55 door Ger van Steenderen
query herkent a.aanvang niet
Sorry moet natuurlijk a.uur zijn
Dus probeer het eens met a.uur