[PHP] Datum gegevens ophalen uit database

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • wayne1984
  • Registratie: November 2004
  • Laatst online: 01-01-2021
Hey mensen,

Ik ben bezig een database te vullen met gegevens van een xml bestand.

Hierbij zet ik de gegevens in 1 tabel genaamd TIJD

Deze wordt als volgt gegenereerd:

JaarMaandDagUurMinuut
200805071210
200805071220
200805071230
....
200912101710
200912011720
200912011730
...
201001071210
201001071230
201001071240
201001071250

Nu wil ik graag een soort van menu maken met links. Allereerst wil ik de jaartallen genereren uit de database.
Dus dan zou je krijgen
2008
2009
2010


Ik heb dit gedaan met een while functie maar ik krijg dus als uitkomst alle gegevens van de database te zien.
Ik zou dus eigenlijk moeten filteren op 1x 2008, 1 x 2009, 1x2010

Ik heb geprobeerd met een arrays, met een like functie, maar het wilt niet vlotten..

Mijn vraag is, hoe moet ik filteren dat ik een waarde maar 1 keer krijg in plaats van meerdere keren en heb ik de gegevens wel goed in de database gezet. Moet ik dit niet scheiden tussen apart de jaren, maanden, dagen, uren en minuten?

Acties:
  • 0 Henk 'm!

  • sjorsjuhmaniac
  • Registratie: Februari 2009
  • Laatst online: 12:52
Het kan eenvoudig met een sql query:
SQL:
1
select distinct LEFT(tijd_colom_name,4) from tijd_table_name


*blind aangenomen dat je MySQL draait :9

[ Voor 17% gewijzigd door sjorsjuhmaniac op 14-01-2010 22:31 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 12:45

MueR

Admin Tweakers Discord

is niet lief

Waar hoort mijn topic?
WEB > PRG

Op jaar groeperen moet toch lukken?
Behalve dat TS een xml gebruikt ipv een database never mind :p

Maareh, left? How about opslaan als een echte datum ipv een loze string en daarop gewoon de YEAR() functie in mysql gebruiken?

[ Voor 64% gewijzigd door MueR op 14-01-2010 22:32 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • sjorsjuhmaniac
  • Registratie: Februari 2009
  • Laatst online: 12:52
Nee toch? hij haalt het uit een xml bestand.

Reactie was nog op "hij gebruit geen db maar xml bestand om het op te slaan", niet op je datetime comment.

Je hebt helemaal gelijk, datetime zit er niet voor niets in.

[ Voor 67% gewijzigd door sjorsjuhmaniac op 14-01-2010 22:35 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 12:45

MueR

Admin Tweakers Discord

is niet lief

Ook vanuit een XML kan je die data gewoon als datetime opslaan in MySQL tijdens het importeren.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • wayne1984
  • Registratie: November 2004
  • Laatst online: 01-01-2021
ik haal de gegevens op van xml.buienradar.nl en daar extract ik de gegevens uit

01/15/2010 08:40:00

naar 201015010840

ik gebruik idd mysql.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Dan moet je het dus omzetten naar het formaat zodat je het kunt opslaan als DATETIME, dat lijkt me geen rocket science :)

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 11-09 23:00

remco_k

een cassettebandje was genoeg

wayne1984 schreef op vrijdag 15 januari 2010 @ 08:54:
ik haal de gegevens op van xml.buienradar.nl en daar extract ik de gegevens uit

01/15/2010 08:40:00

naar 201015010840

ik gebruik idd mysql.
Dus omzetten naar een datetime veld. Simpele manier:
Maak een veld met als type datetime en insert deze datum in deze vorm:
'2010-15-01 08:40:00'
Dat snapt mysql prima als datetime en zet 'm om.
Natuurlijk zou je ook met parameters kunnen gaan werken. Is netter, werkt net zo goed.

Maar een datum opslaan als string is een no-go. :)

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • wayne1984
  • Registratie: November 2004
  • Laatst online: 01-01-2021
Oke dan ga ik eerst nu alles om zetten in de database.. hopelijk dat dit goed gaat:D

Acties:
  • 0 Henk 'm!

  • wayne1984
  • Registratie: November 2004
  • Laatst online: 01-01-2021
oke ik heb de tabel om gezet naar datetime notatie..

moet ik nu een while functie gaan gebruiken om de jaartallen uit te draaien in combinatie van de maketime functie?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Je probeert een gedeelte van je data uit de database te halen. Gebruik dan ook de functionaliteit die de database je biedt.

http://dev.mysql.com/doc/...e-and-time-functions.html

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • wayne1984
  • Registratie: November 2004
  • Laatst online: 01-01-2021
oke tnx ik ga proberen!! ik wil graag het zelf schrijven maar ik ben blij met jullie tips

Acties:
  • 0 Henk 'm!

  • dvdheiden
  • Registratie: Maart 2006
  • Laatst online: 11:21
Zelf vind ik het altijd prettig om in de db gewoon een timestamp te gooien, is makkelijk te vergelijken en eenvoudig om te zetten naar elke gewenste datum weergave.

Acties:
  • 0 Henk 'm!

  • Tarilo
  • Registratie: December 2007
  • Laatst online: 10-09 19:49
Alleen kan je bij een timestamp lang niet zo makkelijk limiten op bijv. jaar. Dan moet je eerst gaan rekenen en nu kun je gewoon de ingebouwde functies van MySQL gebruiken. Wel zo makkelijk.

Acties:
  • 0 Henk 'm!

  • wayne1984
  • Registratie: November 2004
  • Laatst online: 01-01-2021
ik ben nu bezig ermee.

Deze gegevens heb ik nu:

2010-01-15 09:10:00
2010-01-15 09:20:00
2009-08-15 09:10:00
2009-02-10 10:20:00
2010-01-15 09:30:00
2010-01-15 09:40:00
2010-01-15 09:50:00
2010-01-15 10:00:00
2010-01-15 10:10:00

kan ik hier een query op draaien dat ik op het laatste alleen 2009 en 2010 krijg ook al heb ik zo veel waardes?

Acties:
  • 0 Henk 'm!

  • dvdheiden
  • Registratie: Maart 2006
  • Laatst online: 11:21
@laurens:
met mktime kan je vrij eenvoudig een timestamp maken van een specifieke datum. Daarmee kan je in je query dan bijvoorbeeld date > resultaat mktime als je alles vanaf een bepaalde datum wilt. Lijkt me mooier dan in sql een string substringen of iets dergelijks zoals eerder is voorgesteld.

Acties:
  • 0 Henk 'm!

  • Rommel
  • Registratie: Maart 2002
  • Laatst online: 12:40
De onderstaande lijn bijvoorbeeld toevoegen aan je query?
code:
1
WHERE YEAR(tabelnaam_data's) = 2010

je zou er een functie van maken die er per jaar een array ervan maakt als je het jaar als variabele gebruikt... :)

Everything that has a beginning has a end


Acties:
  • 0 Henk 'm!

  • !null
  • Registratie: Maart 2008
  • Laatst online: 11-09 14:00
wayne1984 schreef op vrijdag 15 januari 2010 @ 10:23:
ik ben nu bezig ermee.

Deze gegevens heb ik nu:

2010-01-15 09:10:00
2010-01-15 09:20:00
2009-08-15 09:10:00
2009-02-10 10:20:00
2010-01-15 09:30:00
2010-01-15 09:40:00
2010-01-15 09:50:00
2010-01-15 10:00:00
2010-01-15 10:10:00

kan ik hier een query op draaien dat ik op het laatste alleen 2009 en 2010 krijg ook al heb ik zo veel waardes?
code:
1
SELECT DISTINCT YEAR(timestampcolumn) FROM table;

Ampera-e (60kWh) -> (66kWh)


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

HackZois schreef op vrijdag 15 januari 2010 @ 10:31:
@laurens:
met mktime kan je vrij eenvoudig een timestamp maken van een specifieke datum. Daarmee kan je in je query dan bijvoorbeeld date > resultaat mktime als je alles vanaf een bepaalde datum wilt. Lijkt me mooier dan in sql een string substringen of iets dergelijks zoals eerder is voorgesteld.
Lees de link die ik eerder poste eens door. Ja, timestamps (seconden sinds 1-1-1970) is netter dan een varchar substringen. Maar gewoon het juiste type gebruiken en vervolgens de bijbehorende date en time functions gebruiken is weer een stuk netter.

Het is eerder een 'gebrek' van php dat deze geen fatsoenlijk datetime type heeft en je moet 'kloten' met een integer of string. Binnen php werkt een timestamp inderdaad een stuk makkelijker, maar gelukkig heeft mysql ook keurige conversie functies zodat je je datetime veld als timestamp terug kunt krijgen en een timestamp als bron voor je datetime veld kunt gebruiken.


@wayne1984 hieronder. Mijn reactie is voornamelijk richting HackZois.

[ Voor 3% gewijzigd door Janoz op 15-01-2010 10:46 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • wayne1984
  • Registratie: November 2004
  • Laatst online: 01-01-2021
het is idd een gebrek aan php, maar ik wist niet hoe je functies van mysql kon weergeven in de query.. had steeds een waarde te veel erin gezet waardoor ik geen output kreeg.. ik had je link eens gekeken, staat echt veel in wat je kunt doen met de datetime tabel

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Met de DateTime-class van PHP kun je prima met datums en tijden werken, dan ben je van het gedonder met integers en stringetjes verlost.

http://nl.php.net/manual/en/class.datetime.php

Acties:
  • 0 Henk 'm!

  • wayne1984
  • Registratie: November 2004
  • Laatst online: 01-01-2021
hoehoe ik kom al een stukje verder!!! :D

SELECT YEAR(tijd) FROM gegevens;

krijg ik nu:

2010
2010
2009
2009
2010
2010
2010
2010
2010
2010
2010

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 12:45

MueR

Admin Tweakers Discord

is niet lief

MueR schreef op donderdag 14 januari 2010 @ 22:30:
Op jaar groeperen moet toch lukken?

Maareh, left? How about opslaan als een echte datum ipv een loze string en daarop gewoon de YEAR() functie in mysql gebruiken?
Ik zal mezelf nog even quoten. De gehighlightte stukken moet kan je het echt mee oplossen hoor. 15 posts verder heb je er 2 al gevonden.. nu de laatste nog.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • dvdheiden
  • Registratie: Maart 2006
  • Laatst online: 11:21
@Janoz:
Uiteraard is dat netter, een juist ontworpen database hoort gewoon de juiste field types te hebben! Het hele idee achter een database is daar natuurlijk op gebaseerd.

Het nadeel ervan ligt inderdaad bij PHP, ik heb altijd het idee dat ik meer moeite dan nodig moet doen om het doel te bereiken wat betreft datum selectie en presentatie. In bijv. C# vind ik dat toch wel wat prettiger geregeld, met bijvoorbeeld value.ToShortDateString(), etc.*

*let op, absoluut geen flame, bewust gekozen voor de term "wat betreft" dus alsjeblieft geen PHP vs. [insert_taal]...

Acties:
  • 0 Henk 'm!

  • Joolee
  • Registratie: Juni 2005
  • Niet online
wayne1984 schreef op vrijdag 15 januari 2010 @ 10:47:
hoehoe ik kom al een stukje verder!!! :D

SELECT YEAR(tijd) FROM gegevens;

krijg ik nu:

2010
2010
2009
2009
2010
2010
2010
2010
2010
2010
2010
Hint: kijk eens naar de post van !null ;)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Dat is wel zo, maar met de altijd al in mysql aanwezige functies FROM_UNIXTIME en UNIX_TIMESTAMP kun je in je php gewoon met timestamps werken en in je database de juiste velden gebruiken. Zoveel moeite is dat echt niet.

Daarnaast heeft cariolive23 al laten zien dat dat zelfs al weer achterhaalt is en er dus gewoon een type beschikbaar is in php.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • wayne1984
  • Registratie: November 2004
  • Laatst online: 01-01-2021
DISTINCT is dus om unieke waarde uit eruit te halen.. nu krijg ik idd 2009 uit en 2010 op de query..

ik ga dit nu proberen in php te verwerken om te kijken of ik hetzelfde krijg.. boh ik vind het echt lastig, vooral als je het weer moet oppakken na een tijdje..

SQL-query:
SELECT DISTINCT YEAR( tijd )
FROM gegevens
LIMIT 0 , 30

YEAR(tijd)
2010
2009

[ Voor 16% gewijzigd door wayne1984 op 15-01-2010 11:21 ]


Acties:
  • 0 Henk 'm!

  • wayne1984
  • Registratie: November 2004
  • Laatst online: 01-01-2021
Ik hem hem!!!

code:
1
2
3
4
5
6
7
8
9
10
<?php
include('gegevens.php');

$query = "SELECT DISTINCT YEAR(tijd), DATE_FORMAT(tijd, '%Y') AS jaar FROM gegevens"; 
$r = mysql_query($query) or die (mysql_error());

while ($obj = mysql_fetch_object($r)){
echo"$obj->jaar";
}
?>

[ Voor 20% gewijzigd door wayne1984 op 15-01-2010 12:02 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Je bent een heel klein beetje aan het kloten geweest ;). Je kent nu 2 keer een waarde toe aan query (regel 4 en regel 5). De eerste toekenning is dus zinloos omdat je deze gelijk weer overschrijft. De ; aan het begin van dregel 5 is overbodig. Ah, al aangepast.

Daarnaast heeft de query die je daadwerkelijk gebruikt 2 kolommen. Beide kolommen bevatten dezelfde waarde die op een andere manier berekend wordt. Waarschijnlijk ben je wat aan het pielen geweest, maar de crux van je probleem ligt hem uiteindelijk in de 'as'. Daardoor geef je uiteindelijk je kolom een naam waarmee de fetch object ook goed kan werken.

Vervang regel 4 en 5 eens door:

PHP:
1
$query = "SELECT DISTINCT YEAR(tijd) AS jaar FROM gegevens";


Dat is een stuk netter.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • wayne1984
  • Registratie: November 2004
  • Laatst online: 01-01-2021
een BEETJE aan het kloten ??:P voor mij is dit een hele opgave aan gezien mijn php echt beneden pijl is. zelf mijn broertje zegt dat ik nog met oude codes werk *bloos* ik heb dat van jou vervangen en idd ik krijg het zelfde uit..

nu wil ik er in feite een link van maken en dat ik dan van bv in 2010 naar de maanden ga en dus een query van de maanden maak.. dit kan ik dan eigenlijk toch op de zelfde manier doen?

Aangepast nu

PHP
code:
1
2
3
4
5
6
7
8
9
<?php
include('gegevens.php');

$query = mysql_query("SELECT DISTINCT YEAR(tijd) AS jaar FROM gegevens"); 

while ($r = mysql_fetch_object($query)){
echo"$r->jaar";
}
?>

[ Voor 27% gewijzigd door wayne1984 op 15-01-2010 12:21 ]


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
echo"$r->jaar";

$r->jaar is geen string, het is een variabele/object, zet er dan geen overbodige quotes om:

echo $r->jaar;
Pagina: 1