[C++] Datum naar een weeknummer

Pagina: 1
Acties:
  • 338 views sinds 30-01-2008
  • Reageer

  • Drogo
  • Registratie: Augustus 1999
  • Laatst online: 15-09 22:15
Kan iemand mij een manier vertellen om uit een Access datumveld (dd-mm-jj hh:mm) via MS Visual C++ het weeknummer van die datum te halen?

Ik kan op Microsoft Knowledgebase niet echt iets vinden waarmee dit zou kunnen. Als het niet in C++ kan, is er dan een manier om het via SQL te doen?
tnks.

  • whoami
  • Registratie: December 2000
  • Laatst online: 06:24
Ben ook wel geinteresseerd. Ik heb dit ook nodig voor een van m'n applicaties maar ik gebruik C++ Builder en zou het liefst zonder een SQL-fctie doen. (Denk wel dat het met SQL mogelijk is; maar dat zal afhankelijk zijn van de database die je gebruikt).

Hmm, ik denk net dat je in Builder het weeknr uit de datum kunt halen door een bepaalde property van de TMonthCalendar.

https://fgheysels.github.io/


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 11:21

Janoz

Moderator Devschuur®

!litemod

Ik heb het ooit een keer uitgezocht. Er zijn trouwens wel functies om van een datum een weeknummer te bepalen, maar ja, dan is de uitdaging eraf :)..

Op zich is het weeknummer niet zo heel lastig, je begin aan het begin met week 1 en na elke zondag is het een weeknummer verder :).. Probleem is, wat is week 1, aangezien 1 jan niet altijd mooi op maandag valt.

We hebben toen flink rond zitten bellen, en hebben uiteindelijk bij een agenda maker uitgevonden dat de week waarin de eerste donderdag van het nieuwe jaar valt week nummer 1 is (maar dat weet ik niet meer 100% zeker)

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


Verwijderd

Op vrijdag 11 januari 2002 13:11 schreef whoami het volgende:
Ben ook wel geinteresseerd. Ik heb dit ook nodig voor een van m'n applicaties maar ik gebruik C++ Builder en zou het liefst zonder een SQL-fctie doen. (Denk wel dat het met SQL mogelijk is; maar dat zal afhankelijk zijn van de database die je gebruikt).

Hmm, ik denk net dat je in Builder het weeknr uit de datum kunt halen door een bepaalde property van de TMonthCalendar.
Weeknumbers property is een boolean (wordt alleen getoond). Die kun je dus niet gebruiken.

Google biedt uitkomst, zoek op Delphi en Weeknumber en je krijgt gegarandeerd een functie die dat voor je doet. Ik zeg hier Delphi en dat is vrij makkelijk om te zetten naar C++.

PS. Ik noem hier Delphi omdat ik die routine al een keer zo gevonden heb, ben hem alleen kwijt...

  • pbregman
  • Registratie: Oktober 2001
  • Laatst online: 22-05-2023

pbregman

>:)

Ik heb hier een jaar of 3 terug onderzoek naar gedaan.

als je wilt weten wat voor week is dan kijk je eerst op wat voor dag het jaar begint.

1 januari op een donderdag - zondag: week 1.
1 januari op een maandag - woensdag: week 52 jaar daarvoor.

als het een schrikkeljaar (moet je zelf ff methode schrijven omdat uit te zoeken) geldt:
1 januari op een woensdag - zondag: week 1
1 januari op maandag - dinsdag: week 52 jaar daarvoor

dan reken je uit hoeveelste dag van het jaar het is waarvan jij de datum wilt weten, kan je ook ff zelf code voor schrijven is ook niet moeilijk.

dan DIV je de uitkomst van de hoeveelste dag met 7
als het jaar begon in week 1: tel je er nog 1 bij op.

dat is het weeknummer!

veel succes als je vragen hebt hoor ik het wel

Specs


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 11:21

Janoz

Moderator Devschuur®

!litemod

Schrikkeljaar:
code:
1
2
3
4
5
6
7
8
9
if    (jaar%400 = 0) {
  schrikkel = true;
} else if (jaar%100 = 0) {
  schrikkel = false;
} else if (jaar%4   = 0) {
  schrikkel = true;
} else {
  schrikkel = false;
}

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


  • pbregman
  • Registratie: Oktober 2001
  • Laatst online: 22-05-2023

pbregman

>:)

Op vrijdag 11 januari 2002 13:41 schreef Janoz het volgende:
Schrikkeljaar:
code:
1
2
3
4
5
6
7
8
9
if    (jaar%400 = 0) {
  schrikkel = true;
} else if (jaar%100 = 0) {
  schrikkel = false;
} else if (jaar%4   = 0) {
  schrikkel = true;
} else {
  schrikkel = false;
}
al je if statements met dubbel == aanmaken he >:)
inhoudelijk klopt het verder wel.

Specs


  • Canard
  • Registratie: Oktober 1999
  • Laatst online: 07-09 17:34
check hier voor algoritme...

http://personal.ecu.edu/mccartyr/aboutwdc.htm

van het algoritme heb ik de java-code nog wel ergens liggen als je geinteresseerd bent.

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Is deelbaar door 400 EN door 4 niet al voldoende ?

Wat niet kan is nog nooit gebeurd


  • DolleDries
  • Registratie: Oktober 2000
  • Laatst online: 15-09 21:24
Als je met C++ (middels een OLEDB interface) een datumveld uitleest zal je zien dat dit een DATE formaat heeft.
Het DATE formaat is niets anders dan een floating point getal. Nu kan ik een heel verhaal ophangen hoe je dit kunt berekenen naar een normale dag/maand/jaar omrekening, maar wat veel intresanter is om de class COleDateTime te gebruiken:

COleDateTime stWeekNum;
CString szWeekNum;
stWeekNum = dateFromTable;
szWeekNum = stWeekNum.Format("%U");

En nu heb je het weeknummer in ascii form in een string staan....als je gewoon het nummer wilt hebben doe dan nog een atoi & je bent klaar.

(P.s. dit is de simplistische uitleg, als je goed aan het googlen slaat dan kan je uitgebreide mathematische formules achterhalen hoe je dit alles moet uitrekenen... (8> )

Have fun. :)

  • pbregman
  • Registratie: Oktober 2001
  • Laatst online: 22-05-2023

pbregman

>:)

Op vrijdag 11 januari 2002 13:55 schreef Nexopheus het volgende:
Is deelbaar door 400 EN door 4 niet al voldoende ?
NEE, tuurlijk. 1900 is ook deelbaar door 4 en is toch echt GEEN schrikkeljaar, lees het nog eens goed na dat stukje zou ik zeggen :)

Specs


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op vrijdag 11 januari 2002 13:41 schreef Janoz het volgende:
Schrikkeljaar:
code:
1
2
3
4
5
6
7
8
9
if    (jaar%400 = 0) {
  schrikkel = true;
} else if (jaar%100 = 0) {
  schrikkel = false;
} else if (jaar%4   = 0) {
  schrikkel = true;
} else {
  schrikkel = false;
}
Je bent nu dus wel voor 99% van de gevallen 3 ifs verder.

Als je de volgorde omdraait:
if ( jaar%4 != 0 )
schrikkel = false
else if ( jaar % 400 == 0 )
schrikkel = true
else if ( jaar % 100 == 0 )
schrikkel = false
else
schrikkel = true

Da's in 75% van de gevallen 1 if, dus 2x zo snel.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 11:21

Janoz

Moderator Devschuur®

!litemod

Op vrijdag 11 januari 2002 13:46 schreef Vibe het volgende:

[..]

al je if statements met dubbel == aanmaken he >:)
inhoudelijk klopt het verder wel.
psuedo code.. Gaat om het id :)

het kan ietsje sneller zoals hierboven te zien is, maar mijn post ging gewoon om het ID :)

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15-09 22:39
In vb kan het met de Format functie
code:
1
Weeknummer=Format(Datum,"ww",vbFirstFourDays)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 14:07

crisp

Devver

Pixelated

Wel even opletten: er zijn nl 2 manieren van weeknummering.
1 daarvan is de Gregoriaanse methode (die wij dus gebruiken en waarbij de week waarin de donderdag in januari valt week 1 is).
Je hebt ook volksstammen die beweren dat de week waarin 1 januari valt al week 1 is, of dat de week waarin 4 januari valt week 1 is (komt neer op de Gregoriaanse methode, mits je aanneemt dat een week van maandag t/m zondag loopt - ook hier verschillen de meningen soms).
Ik heb wel een routine om het te berekenen, maar die is in CL; denk niet dat veel mensen hier er iets aan hebben...

Intentionally left blank

Pagina: 1