Query op time-veld

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

George van Baasbank

George van Baasbank

05/03/2014 09:52:58
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
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
 
PHP hulp

PHP hulp

22/12/2024 08:27:12
 
Michael -

Michael -

05/03/2014 10:41:46
Quote Anchor link
WHERE
HOUR(ss.aanvang) = 10
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/03/2014 10:56:24
Quote Anchor link
Let op dat filteren op velden die binnen een functie staan altijd een full table scan opleveren.
Dus dan is het beter om:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
WHERE ss.aanvang BETWEEN '10:00:00' AND '10:59:59'

te doen.
 
George van Baasbank

George van Baasbank

05/03/2014 15:41:16
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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
 
Michael -

Michael -

05/03/2014 15:44:10
Quote Anchor link
Die van Ger zou iets sneller zijn. Dit merk je pas als je een grote tabel hebt. Misschien dat Ger het verder kan toelichten.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/03/2014 16:51:00
Quote Anchor link
@George,
Een andere manier:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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
 
George van Baasbank

George van Baasbank

05/03/2014 17:20:18
Quote Anchor link
query herkent a.aanvang niet
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/03/2014 17:26:10
Quote Anchor link
Sorry moet natuurlijk a.uur zijn
 
Ivo P

Ivo P

05/03/2014 17:26:21
Quote Anchor link
"tabel" a lijkt alleen een kolom "uur" te hebben.

Dus probeer het eens met a.uur
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.