[PHP/MySQL] Begin/einddatum weeknummer op basis van datum

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 30-07 20:36
Ik ben nu al een tijdje aan het denken hoe ik aan de juiste start- en einddatum van een week kom. Er zijn hiervoor allerlei functies en die werken allemaal prima totdat je rond de jaarwisseling komt.

Zo is 1-1-2015 namelijk volgens het ISO 8601 formaat nog week 52 van 2014, en daar gaan alle functies dan weer mis die ik kan vinden.

Het weeknummer van de week bepaal ik in de SQL query op de volgende manier (Waarin WeekDatum een "DATE" field is met bijvoorbeeld de waarde 2015-01-01)

code:
1
2
3
SELECT *, WEEK(WeekDatum, 3) as WeekNummer
FROM marketingtaken 
ORDER BY WeekDatum DESC

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
For mode values with a meaning of “with 4 or more days this year,” weeks are numbered according to ISO 8601:1988:
Geen idee of mysql, maar vast vergelijkbaar of anders met date_format() aanwezig in menig ander dbms.

edit:
Hmz, die mode parameter gebruik je al.


Wat is dan je probleem? Zoek je juist een PHP functie? 8)7

[ Voor 15% gewijzigd door Voutloos op 28-07-2015 11:54 ]

{signature}


Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 30-07 20:36
Het hoeft ook niet in de query zelf, die gebruik ik alleen om het juiste weeknummer te bepalen. Maar ook met PHP code heb ik geen idee hoe ik dit moet regelen. Alle functies die ik heb gevonden gaan uit van een een jaartal welke je aanlevert, maar dat kunnen 2 jaartallen zijn zoals bij 1-1-2015.

Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 30-07 20:36
Of houd ik mij niet goed aan de standaarden en is 1-1-2015 wel week 1?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
PHP date() en dan 'W'? En dat formaat is gebruikt in tal van PHP functions.

Het zou ook weeknummer 1 moeten zijn volgens http://www.epochconverter...e/weeknumbers-by-year.php

Dus poc: http://3v4l.org/qd4Vt

[ Voor 35% gewijzigd door Voutloos op 28-07-2015 12:01 ]

{signature}


Acties:
  • 0 Henk 'm!

  • begintmeta
  • Registratie: November 2001
  • Niet online

begintmeta

Moderator General Chat
xost schreef op dinsdag 28 juli 2015 @ 11:56:
Of houd ik mij niet goed aan de standaarden en is 1-1-2015 wel week 1?
Er zijn verschillende standaarden, ISO 8601 specificeert volgens mij dat week 1 de eerste week na jaarweeknummer 52 of 53 met een donderdag is, dus eventueel is bijvoorbeeld 29-31 december al deel van week 1 of 1-3 januari week 53

[ Voor 2% gewijzigd door begintmeta op 28-07-2015 12:13 . Reden: hopelijk wat duidelijker geformuleerd ]


Acties:
  • 0 Henk 'm!

  • Mike78
  • Registratie: September 2000
  • Laatst online: 30-07 21:51

Mike78

Always

Volgens mij is het wel week 1 hoor?

The numbering of the ISO calendar weeks is defined (sect. 2.2.10 on p. 5) as:

[...] the first calendar week of a year is that one which includes the first Thursday (=donderdag 1-1-2015) of that year and [...] the last calendar week of a calendar year is the week immediately preceding the first calendar week of the next calendar year.

24 uur per dag, 24 biertjes in een krat. Toeval?


Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 30-07 20:36
Dan gebruik ik dus al de verkeerde methode om het weeknummer te bepalen, welke methode is dan wel juist?

code:
1
2
3
4
5
6
7
8
9
mode    Explanation     Returns
0   First day of the week is Sunday     0-53
1   First day of the week is Monday and the first week has more than 3 days     0-53
2   First day of the week is Sunday     1-53
3   First day of the week is Monday and the first week has more than 3 days     1-53
4   First day of the week is Sunday and the first week has more than 3 days     0-53
5   First day of the week is Monday     0-53
6   First day of the week is Sunday and the first week has more than 3 days     1-53
7   First day of the week is Monday     1-53


Het systeem wordt gewoon in Nederland gebruikt worden, ik wil mij dus aan de nederlandse 'regels' houden.

[ Voor 8% gewijzigd door WoBBeL op 28-07-2015 12:05 ]


Acties:
  • 0 Henk 'm!

  • Koetjeboe
  • Registratie: Maart 2002
  • Laatst online: 12:47

Koetjeboe

Boe, zegt de koe

code:
1
2
3
4
$weekBeginDate = new DateTime();
$weekBeginDate->setISODate($year,$weekNr);
$weekEndDate = new DateTime();
$weekEndDate->setISODate($year,$weekNr, 7);


Zoiets gebruiken we hier voor iets vergelijkbaars. (PHP) Gebruikt ISO 8601 wat ook in Nederland gebruikelijk is volgens mij.

[ Voor 13% gewijzigd door Koetjeboe op 28-07-2015 12:07 ]


Acties:
  • 0 Henk 'm!

  • croxz
  • Registratie: Juni 1999
  • Laatst online: 15:56
Wij gebruiken de volgende logica:
[...]is gebaseerd op weeknummers, waarbij een week begint op maandag (en week 1 de week is waarin 4 januari valt).
Ik zal eens kijken welke standaard dat is.

Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 30-07 20:36
croxz schreef op dinsdag 28 juli 2015 @ 12:07:
Wij gebruiken de volgende logica:

[...]

Ik zal eens kijken welke standaard dat is.
Dat wil zeggen: 1-1-2015 is dus wel week 52 van het jaar ervoor?

Acties:
  • 0 Henk 'm!

  • Mike78
  • Registratie: September 2000
  • Laatst online: 30-07 21:51

Mike78

Always

xost schreef op dinsdag 28 juli 2015 @ 12:08:
[...]


Dat wil zeggen: 1-1-2015 is dus wel week 52 van het jaar ervoor?
Nee want zondag 4 januari valt nog in die week.

24 uur per dag, 24 biertjes in een krat. Toeval?


Acties:
  • 0 Henk 'm!

  • croxz
  • Registratie: Juni 1999
  • Laatst online: 15:56
Wikipedia geeft mij gelijk :-)

https://nl.wikipedia.org/wiki/Weeknummer
Het weeknummer is het volgnummer dat een week in een kalenderjaar krijgt. Volgens de internationale standaard ISO 8601 is de eerste week van een jaar de week die vier of meer dagen van dat kalenderjaar bevat. Omdat maandag als eerste dag van de week beschouwd wordt, komt het erop neer dat week 1 de week is, waarin de eerste donderdag van dat jaar zit, en de week waar 4 januari in valt. 1 februari valt altijd in week 5. Ter illustratie: met deze methode valt zondag 26 juli 2015 in week 30.
xost schreef op dinsdag 28 juli 2015 @ 12:08:
[...]
Dat wil zeggen: 1-1-2015 is dus wel week 52 van het jaar ervoor?
Soms wel en soms niet.
1-1-2015 valt in week 1, maar 1-1-2016 valt in week 53.

[ Voor 3% gewijzigd door croxz op 28-07-2015 12:12 ]


Acties:
  • 0 Henk 'm!

  • SinergyX
  • Registratie: November 2001
  • Laatst online: 17:03

SinergyX

____(>^^(>0o)>____

De NEN 2772 is daar toch ook vrij duidelijk in? Week begint altijd maandag, eerste week bevalt altijd 4 januari (en dus vanuit Xost, is dat optie 3, meer dan 3 dagen).

Nog 1 keertje.. het is SinergyX, niet SynergyX
Im as excited to be here as a 42 gnome warlock who rolled on a green pair of cloth boots but was given a epic staff of uber awsome noob pwning by accident.


Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 30-07 20:36
Okidoki, dan is mij dat nu helemaal duidelijk :) ik ga de code eens proberen met bovenstaand in gedachten

Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 30-07 20:36
Query

code:
1
2
3
SELECT *, YEAR(WeekDatum) as WeekJaar, WEEK(WeekDatum, 3) as WeekNummer
FROM marketingtaken 
ORDER BY WeekDatum DESC


PHP code
PHP:
1
2
3
4
5
6
7
$week_begin                                         = new DateTime();
$week_begin->setISODate                             ( $MySQL_Taken_Assoc['WeekJaar'], $MySQL_Taken_Assoc['WeekNummer'] );
$week_eind                                          = new DateTime();
$week_eind->setISODate                              ( $MySQL_Taken_Assoc['WeekJaar'], $MySQL_Taken_Assoc['WeekNummer'], 7 );        

echo $week_begin->format( "d-m-Y" );
echo $week_eind->format( "d-m-Y" );


So far so good, lijkt allemaal te kloppen :)

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Nu online
Wat SinergyX zegt klopt volgens mij met wat we in Nederland normaal vinden. Week 1 is de week waarvan minimaal 4 dagen in het nieuwe jaar vallen. Uit dat gegeven kun je een aantal zaken afleiden:
- De vierde dag van het jaar valt altijd in week 1.
- De vierde dag van de week (donderdag) valt altijd in het jaar waar het weeknummer voor geldt.

Ik gebruik een functie om van weeknummer/dag/jaar naar een datum te gaan volgens het volgende principe:
1. bepaal op welke weekdag 4 januari valt
2. bepaal het verschil in weekdag tussen gevraagde weekdag en 4 januari
3. tel daar het aantal dagen bij op van de volle weken
4. laat strtotime een timestamp maken voor het verschil tussen 4 januari en het aantal dagen verschil.

Die functie is overigens al 10+ jaar oud, dus het zou me niets verbazen als er tegenwoordig native ondersteuning is voor het een en ander. Volgens stackoverflow zou dit moeten werken:
PHP:
1
2
strtotime("2011W01"); //maandag van week 1 van 2011
strtotime("2011W01 + 2days"); //woensdag van week 1 van 2011

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
Als je in php dates wilt weergeven, dan altijd met strftime, dat is locale-aware. Vergeet niet je locale ook goed te zetten :) date() is alleen Amerikaans, altijd strftime. Dan kun je ooit bv ook gewoon dagnamen en maandnamen gebruiken als je dat nodig hebt.

strftime ondersteunt verder native het juiste weeknummer met %V ( http://php.net/manual/en/function.strftime.php )

Mysql zou het moeten doen met date_format( datecolumn, "%u %x") (week / jaar), en voor eerste dag van de week zie http://stackoverflow.com/a/18143409

Never explain with stupidity where malice is a better explanation

Pagina: 1