Alle datums

Door Eddy E, 14 jaar geleden, 5.275x bekeken

Hier gaan we werken met data, als in het meervoud van datum.
Omdat data nogal verwarrend kan zijn, gebruik ik het (foutieve) datums.

Vooraf kan het handig zijn om alle dagen in een tabel in je database op te nemen.
Een sql-dump met alle datums tussen 1-1-1970 en 31-12-2070 kan je hier downloaden.

Nu wel al die gegevens hebben gaan we er even mee spelen.
Let wel dat ik steeds in het jaar 2009 blijf spelen, maar dat hoeft natuurlijk niet.

Alle datums van zondagen selecteren

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT datum
FROM alle_data
WHERE YEAR(datum) = '2009'
AND DAYOFWEEK(datum) = 1
ORDER BY datum ASC


Alle maandagen selecteren met weeknummer
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT DAYNAME( datum ) AS naam, datum, WEEK( datum ) AS weeknummer
FROM alle_data
WHERE YEAR( datum ) = '2009'
AND DAYOFWEEK( datum ) =2
ORDER BY datum ASC


Alle dagen en datums van de eerste dag van een maand
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT DAYNAME(datum) AS naam, datum
FROM alle_data
WHERE YEAR(datum) = '2009'
AND DAYOFMONTH(datum) = 1
ORDER BY datum ASC


Aantal dagen per maand
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT MONTHNAME(datum) AS maand, COUNT(datum) AS aantal_dagen
FROM alle_data
WHERE YEAR(datum) = '2009'
GROUP BY MONTH(datum)
ORDER BY datum ASC


Aantal dagen per maand
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT MONTHNAME(datum) AS maand, COUNT(datum) AS aantal_dagen
FROM alle_data
WHERE YEAR(datum) = '2009'
GROUP BY MONTH(datum)
ORDER BY datum ASC


Alle werkdagen van een jaar/maand
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT datum, DAYNAME(datum)
FROM alle_data
WHERE YEAR( datum ) = '2009'
AND MONTH( datum ) = '3'
AND DAYOFWEEK( datum ) BETWEEN 2 AND 6
ORDER BY datum ASC



Je ziet dat de mogelijkheden eigenlijk eindeloos zijn.
In veel script-request zie ik dat ze een kalendertje willen maken.
Met daarbij het weeknummer, dagen etc.
Nu moet dat goed mogelijk zijn.

Voor voldoende leesvoer en alle functies: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

Van harte succes toegewenst.

(orgineel gepost op webmastercity.nl)

Gesponsorde koppelingen

PHP script bestanden

  1. alle-datums

 

Er zijn 16 reacties op 'Alle datums'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Eddy E
Eddy E
14 jaar geleden
 
0 +1 -0 -1
Geschreven als reactie op al de topics alhier waarin ze vragen naar datums.
Zoals het aantal werkdagen tussen 2 datums etc.
Of de datums van de weeknummers etc.
- -
- -
14 jaar geleden
 
0 +1 -0 -1
Tegenwoordig mag (helaas) datums ook als meervoud van datum gebruikt worden...

De vraag is of het handig is om al die data in je database te zetten. Je kunt het toch ook prima genereren met PHP en MySQL? Dan is het veel dynamischer.
Jelmer -
Jelmer -
14 jaar geleden
 
0 +1 -0 -1
Er zijn situaties waarin je voor alle dagen in de week bepaalde data uit je database wilt hebben. Dit kan met een group by, maar het gaat mis zodra er voor één dag geen data is (hij slaat de dag over)

Als je dan niet ingewikkeld wil gaan doen door met PHP de gaten in je result-set op te zoeken, kan je in plaats van data groeperen op datums (om even het verschil tussen data & data duidelijk te houden ;) ) ook alle data joinen aan een lijst van datums. Op die manier heb je in ieder geval de complete range van datums in je result-set zitten. Ook voor die dagen dat er geen data voor was. Dat laatste is trouwens wel afhankelijk van welke JOIN je gebruikt.

Eigenlijk is het best stom dat een database dat niet voor je kan doen. Alhoewel, pgsql heeft er wel een functie voor geloof ik.
Eddy E
Eddy E
14 jaar geleden
 
0 +1 -0 -1
@ Herjan: ... in mijn optiek is alleen 'data' goed ;).
Gelukkig deel jij die mening.

Echter, alle datums (ja, voor de duidelijk) verkrijgen in PHP is echt niet makkelijker dan 1 query uitvoeren.
Zeker niet als je iets simpels wilt berekenen... dan is het met PHP toch veel meer werk dan 1 query opstellen (en uitvoeren).

@ Jelmer: jij vat inderdaad duidelijk samen waarom ik dit gedaan heb.
een JOIN LEFT op deze tabel (dus datums links, verjaardagen-datums rechts aankoppelen) is inderdaad makkelijker.
Je krijgt dan gewoon een kalender met daarbij de datums van de verjaardagen erbij.
Dan hoef je niet met PHP alle dagen te berekenen en daarbij de resulaten van je query erbij te zoeken.

Dat een database dit niet standaard heeft is dom ja.
Want de database (zelfs mysql op myIsam) kent/gebruikt de database wel, maar geeft hem niet vrij.
Daarom dit.
Eventueel heb ik ook het maak-php-bestand nog wel (erg beun: namelijk met een timestamp verhogen en gewoon vele invoeg-queries).
Frank -
Frank -
14 jaar geleden
 
0 +1 -0 -1
Quote:
Eigenlijk is het best stom dat een database dat niet voor je kan doen. Alhoewel, pgsql heeft er wel een functie voor geloof ik.

Yep, generate_series()
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT
  (CURRENT_DATE + x.datum) AS datum
FROM
  generate_series(0,14) AS x(datum);

En dat levert vandaag de volgende reeks op:
Quote:
'2009-03-20'
'2009-03-21'
'2009-03-22'
'2009-03-23'
'2009-03-24'
'2009-03-25'
'2009-03-26'
'2009-03-27'
'2009-03-28'
'2009-03-29'
'2009-03-30'
'2009-03-31'
'2009-04-01'
'2009-04-02'
'2009-04-03'

Mocht je deze datum nog even willen opmaken, gebruik dan to_char().
Onbekend Onbekend
Onbekend Onbekend
14 jaar geleden
 
0 +1 -0 -1
Dit is zoooo dom. Waarom zou je deze data opslaan in een database? Met PHP kun je dit makkelijk zo doen. Gewoon een paar if-, for- en while-tjes klaar. Dit is echt het domste wat ik ooit heb gezien, laat staan het domste gebruik van een database ooooit.
Eddy E
Eddy E
14 jaar geleden
 
0 +1 -0 -1
Tommy: dan ga ik de uitdaging aan.

Graag zou ik de php-code willen zien waarin ik zie: de datum, dagnaam en weeknummer van alle werkdagen met daarbij het weeknummer tussen 20-3-2009 en 31-4-2009.

Ik zou het zo doen:

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
<?php
$result
= fetch("SELECT
  datum,
  DAYNAME(datum) AS dagnaam,
  WEEK(datum) AS weeknummer
FROM alle_data
WHERE datum BETWEEN '2009-3-20' AND '2009-4-31'
AND DAYOFWEEK( datum ) BETWEEN 2 AND 6
ORDER BY datum ASC"
);

foreach($result as $row)
 {

 echo 'Week ' . $row['weeknummer'] . ': ' . $row['dagnaam'] . ' ' . $datum . '<br>';
 }

?>


Oke... fetch() is dan een eigen functie waardoor foutafhandeling etc al meegenomen worden en alles direct in een gewone array staat.
Toby hinloopen
toby hinloopen
14 jaar geleden
 
0 +1 -0 -1
Ik had toch liever een class gezien die zoiets kon ipv een database.
Ben het wel met tommy eens.

Database is voor het opslaan van VARIABLEN, geen constanten.
GaMer B
GaMer B
14 jaar geleden
 
0 +1 -0 -1
Dit zijn niet 'alle' data (nee ik ga niet datums gebruiken). Waar is het jaar 2090 bijvoorbeeld?

Beetje onzin om die allemaal in de databas te pleuren vind je ook niet? Verder ben ik het wel helemaal eens met Eddy dat rekenen met data via de database moet, want met PHP ben je met 30 regels nog niet klaar (bij wijze van spreken).
- -
- -
14 jaar geleden
 
0 +1 -0 -1
@GaMer13: Inderdaad, het rekenen kan prima met een database, maar als je daarvoor alle data moet opslaan moet je toch een andere oplossing zoeken. Verder kán dit script gewoon niet (goed): als je alle data op zou slaan zou je een oneindige hoeveelheid ruimte moeten hebben. Nou ja, oneindig niet, maar wel vanaf de oerknal tot en met het doven van de zon. Voor de begrippen van dit moment inderdaad oneindig.
Eddy E
Eddy E
14 jaar geleden
 
0 +1 -0 -1
@ Jonathan / Gamer13: daarover heb ik ook nagedacht inderdaad.
PHP kan niet verder terugrekenen (met date() dan) dan ergens rond 1600.
Ook SQL heeft daar echt moeite mee. Heeft iets te maken met de Juliaanse en Gregoriaanse kalender.

Met de functies FROM_DATE() kan je zogenaamd wel iets berekenen, maar er is wel een minimale waarde.

Het einde (2090? 9090?) is inderdaad een ander verhaal.
Echter, de meeste mysql-ers zullen hier wel genoeg aan hebben.
En zo niet: dan post ik even het php-maak-scriptje.
Zoals eerder gezegd: professionals of mensen die echt veel moeten rekenen kunnen beter overstappen op pgSQL of een andere database die dat wel kent.

Een class vind ik niet echt sneller/makkelijker. Ik zou er een functie van kunnen maken (gewoon één functie), maar of dat sneller is weet ik niet.

Ik ben nog aan het kijken of ik de nationale feestdagen (nederlandse) kan invoeren zodat die niet mee tellen met werkdagen (denk aan de kerstdagen, pasen, pinksteren, oud-nieuw, koninginnedag, 4/5 mei etc).
Harmen
Harmen
14 jaar geleden
 
0 +1 -0 -1
@Herjan
Dat mag al sinds 2005.
Onbekend Onbekend
Onbekend Onbekend
14 jaar geleden
 
0 +1 -0 -1
Quote:
Tommy: dan ga ik de uitdaging aan.

Graag zou ik de php-code willen zien waarin ik zie: de datum, dagnaam en weeknummer van alle werkdagen met daarbij het weeknummer tussen 20-3-2009 en 31-4-2009.

Ga je eigen scripts maken. Zoek zelf maar uit hoe je dit het beste kan doen zonder DB.
Klaasjan Boven
Klaasjan Boven
14 jaar geleden
 
0 +1 -0 -1
@Tommy dat is een zwak antwoord, eddy heeft gewoon gelijk het is nagenoeg onmogelijk om nu met bijv sql de werkdagen van het komende jaar op te halen. eddy zijn script is hier perfect voor
Robin de Vries
Robin de Vries
14 jaar geleden
 
0 +1 -0 -1
1. een mooier meervoud van datums is data.
2. het idee is grappig, maar het is natuurlijk zonde van de database om hem te gaan vullen met data(datums). En van 1970-2070 heb je natuurlijk ook niet alles wat je nodig hebt, als je verjaardagen wilt uitrekenen van iemand uit 1968 bijvoorbeeld.
3. een manier om dit met php te maken... Een eigen timestamp maken en dan met een for-lus alles te voorschijn toveren ;). Probeer maar een leuke class te schrijven.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Roel -
Roel -
14 jaar geleden
 
0 +1 -0 -1
Met jaar is dit makkelijker:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<select name="jaar">
<?php
for($i = 1900; $i <= 2010; $i++) {
    echo '<option value="'.$i.'">'.$i.'</option>';
}

?>

</select>


5 regels code, en je hebt van het jaar 1900 tot aan 2010. Lijkt mij makkelijker :)

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. alle-datums

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

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.