[MYSQL] Select 2 weken na datum

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

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 22-08 14:04

me1299

$ondertitel

Topicstarter
Ik weet dat dit nogal een RTFM vraag is, maar ik wordt vaak niet echt wijs uit een manual zoals die van mysql.

http://www.mysql.com/doc/D/a/Date_and_time_functions.html

Concreet wordt ik er niet veel wijzer van. :?

Ik heb mijn database een tabel met o.a een veld: productDatum. Als veldtype gebruik ik 'Date'

Nu heb een zoekpagina gemaakt, werkt allemaal leuk enzo, alleen moeten verkochte producten nog 2 weken in het actueel aanbod komen te staan.

Hoe kan ik nu in 1 query alles opvragen met de datum van het product + 2weken?

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Verwijderd

Tip: kijk eens naar het stukje dat over DATE_ADD. Je kunt 14 dagen optellen of aftrekken van een datum... Daar moet het mee lukken... :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

icm met het stukje van between natuurlijk.. Wat wil je? tussen nu en over twee weken? probeer dat eens letterlijk naar sql te vertalen :)

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


  • me1299
  • Registratie: Maart 2000
  • Laatst online: 22-08 14:04

me1299

$ondertitel

Topicstarter
Op maandag 06 mei 2002 11:25 schreef JeroenDega het volgende:
Tip: kijk eens naar het stukje dat over DATE_ADD. Je kunt 14 dagen optellen of aftrekken van een datum... Daar moet het mee lukken... :)
He bedankt er staan idd nog een paar handige concrete voorbeelden bij ook. Dit gaat wel lukken denk ik ;)

Thanx!

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


  • me1299
  • Registratie: Maart 2000
  • Laatst online: 22-08 14:04

me1299

$ondertitel

Topicstarter
Na heel veel geploeter kom ik er toch niet uit :o

Ik zal even een stukje code en uitleg presenteren.

Eerst verricht ik een query om te kijken hoeveel results het op zal gaan leveren:
PHP:
1
<?//Kijken hoeveel resulsts er zijn  $query = ("SELECT COUNT(*) AS ROWS FROM tblwoningen, tblplaatsen ");  $query .= "WHERE tblwoningen.plaatsID = tblplaatsen.plaatsID ";  $query .= "AND woningSoort = '$search' ";  if($search == "0") {    $query .= ""  }  if($prijssoort == "0") {    $query .= "AND woningPrijsSoort = '$prijssoort' ";  } elseif($prijssoort == "1") {    $query .= "AND woningPrijsSoort = '2' ";  } elseif($prijssoort == "2") {    $query .= "AND woningStatus = '3' ";  }  if($prijsIndex == 1) {    $query .= "AND (woningPrijs > 0 AND woningPrijs <= 50000) ";  }  if($prijsIndex == 2) {    $query .= "AND (woningPrijs > 50000 AND woningPrijs <= 100000) ";  }  if($prijsIndex == 3) {    $query .= "AND (woningPrijs > 100000 AND woningPrijs <= 150000) ";  }  if($prijsIndex == 4) {    $query .= "AND (woningPrijs > 150000 AND woningPrijs <= 200000) ";  }  if($prijsIndex == 5) {    $query .= "AND (woningPrijs > 200000 AND woningPrijs <= 250000) ";  }  if($prijsIndex == 6) {    $query .= "AND (woningPrijs > 250000) ";  }  if($plaatsID != "0") {    $query .= "AND tblplaatsen.plaatsID = $plaatsID ";  }  $result = mysql_query($query);?>

Deze query doe ik om ervoor te zorgen dat mijn navigatie balk goed werkt.

Na het verwerken van enige taken komt mijn 2e query de de daad werkelijke resultaten uitprint:
PHP:
1
<? $query = "SELECT tblwoningen.woningID,                 tblwoningen.woningAdres,                 tblwoningen.woningKorteOmschrijving,                 tblwoningen.woningPrijs,                  tblwoningen.woningStatus,                 tblwoningen.plaatsID, ";if($Foto == "on") {  $query .= "tblwoningen.woningFotoKlein";}$query .= ", tblplaatsen.plaatsNaam ";$query .= "FROM tblwoningen, tblplaatsen ";$query .= "WHERE tblwoningen.plaatsID = tblplaatsen.plaatsID ";$query .= "AND woningSoort = '$search' ";if($prijssoort == "0") {  $query .= "AND woningPrijsSoort = '$prijssoort' ";} elseif($prijssoort == "1") {  $query .= "AND woningPrijsSoort = '2' ";} elseif($prijssoort == "2") {  $query .= "AND woningStatus = '3' ";}if($prijsIndex == 1) {  $query .= "AND (woningPrijs > 0 AND woningPrijs <= 50000) ";}if($prijsIndex == 2) {  $query .= "AND (woningPrijs > 50000 AND woningPrijs <= 100000) ";}if($prijsIndex == 3) {  $query .= "AND (woningPrijs > 100000 AND woningPrijs <= 150000) ";}if($prijsIndex == 4) {  $query .= "AND (woningPrijs > 150000 AND woningPrijs <= 200000) ";}if($prijsIndex == 5) {  $query .= "AND (woningPrijs > 200000 AND woningPrijs <= 250000) ";}if($prijsIndex == 6) {  $query .= "AND (woningPrijs > 250000) ";}if($plaatsID != "0") {  $query .= "AND tblplaatsen.plaatsID = $plaatsID ";}$query .= "ORDER BY $SortMethod ";$query .= "LIMIT $start, $till";?>

Nu weet ik dat ik met de volgende code te werk moet gaan:
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
-> INTERVAL 14 DAY);
-> 1998-01-01 23:59:59
Maar hoe moet ik dat in mijn query inplanteren. Het probleem is dat nogal weinig (lees geen) ervaring heb met calculaties uitvoeren binnen een query zelf.


edit:
* Janoz kan beter uitlijnen dan Topix :)

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Verwijderd

quick & dirty:
code:
1
2
3
$vandaag = date("Y-m-d");
$datum = explode("-", $vandaag);
$tweeweken = date("Y-m-d", mktime(0,0,0, $datum[1], ($datum[2] + 14), $datum[0]));

Dat moet het toch wel doen ;)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 07 mei 2002 10:32 schreef pinguin het volgende:
quick & dirty:
Heel dirty, als je bedenkt dat mysql er gewoon functies voor heeft.

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 22-08 14:04

me1299

$ondertitel

Topicstarter
Op dinsdag 07 mei 2002 10:32 schreef pinguin het volgende:
quick & dirty:
code:
1
2
3
$vandaag = date("Y-m-d");
$datum = explode("-", $vandaag);
$tweeweken = date("Y-m-d", mktime(0,0,0, $datum[1], ($datum[2] + 14), $datum[0]));

Dat moet het toch wel doen ;)
Bedankt voor de code die zal ik gebruiken als mij verder geen andere oplossing rest :D

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Verwijderd

Op dinsdag 07 mei 2002 10:36 schreef ACM het volgende:

[..]

Heel dirty, als je bedenkt dat mysql er gewoon functies voor heeft.
Precies, maar naar mijn beste weten heeft oracle niet van die mooie functies die mysql wel heeft, waardoor het alsnog in php opgelost moet worden ;). Maar ik kan mij natuurlijk vergissen :).

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 22-08 14:04

me1299

$ondertitel

Topicstarter
Op dinsdag 07 mei 2002 10:45 schreef pinguin het volgende:

[..]

Precies, maar naar mijn beste weten heeft oracle niet van die mooie functies die mysql wel heeft, waardoor het alsnog in php opgelost moet worden ;). Maar ik kan mij natuurlijk vergissen :).
Oracle heeft naar mijn weten hele mooie functies :)

Maaruh ik gebruik nog altijd mysql :o

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Verwijderd

Op dinsdag 07 mei 2002 10:47 schreef DeathKnight het volgende:

[..]

Oracle heeft naar mijn weten hele mooie functies :)

Maaruh ik gebruik nog altijd mysql :o
Hmm, ik heb hier het document sql reference voor oracle 9i voor mij liggen, maar daarin kan ik deze functionaliteit helaas niet vinden (wel add_month trouwens)... :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

Je wil de datum tussen nu en 2 weken hebben.
Normale aanpak:

1 Hoe krijg ik de datum nu en over twee weken.

Daar was je al uit. Nu krijg je met NOW() en over twee weken met DATE_ADD(NOW(), INTERVAL 14 DAY).

2 Hoe kan ik kijken of een datum tussen 2 data ligt

Dat heb ik je ook al laten opzoeken. Dit werkt met expr BETWEEN ondergrens AND bovengrens

3 Samenvoegen

Waneer je bij expr nu eens de te controleren datum, bij ondergrens now en bovengrens de dateadd gedoe neerzet...

(datum BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 14 DAYS))

Heb je toch je expressie? Zo moeilijk is het toch niet? Deze kan toch gewoon ergens in je Where geplakt worden?

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


Verwijderd

Ja, maar wat als je nu met de weken over 52 komt, dus overgaat naar het nieuwe jaar, doet hij het dan nog steeds goed?

want ik heb een SQL string hier:

SELECT * FROM wedstrijden WHERE YEARWEEK(datum, 1) >= YEARWEEK (CURRENT_DATE(), 1) AND YEARWEEK(datum, 1) <= YEARWEEK(CURRENT_DATE(), 1)+5

...

Als ik nu zeg maar op 28 december op de site kom, dan gaat hij dus vanaf week 52 er 5 bij op tellen, wat dus resulteert in 57.... en dat gaat niet lukken...

Hoe los je zoiets op dat hij verder gaat met week1 en een nieuw jaar?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Daarom moet je ook datums genereren en niet weeknummers...

Ik zie nergens in dit topic iets over weeknummers staan, dus jouw "ja maar" slaat nergens op :)
(een schop van een topic van een jaar oud is ook niet zo zinvol).

Verwijderd

ACM schreef op 22 mei 2003 @ 16:47:
Daarom moet je ook datums genereren en niet weeknummers...

Ik zie nergens in dit topic iets over weeknummers staan, dus jouw "ja maar" slaat nergens op :)
(een schop van een topic van een jaar oud is ook niet zo zinvol).
Ik vraag alleen maar... en ik zeg alleen dat ik ook met iets in die trend bezig ben, en dat mijn SQL string op dit moment niet 100% goed is, getuige het probleem wat ik heb voorgelegd.

En jouw opmerking van datums genereren ipv weeknummers is leuk, maar daar schieten we ook niks mee op. En waarom zou het schoppen van een topic als dit niet zinvol zijn? Moet ik dan een nieuwe openen met dezelfde vraag? Daar zitten ze hier op te wachten zeker...

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

MySQL heeft ADDDATE of Add_date oid toch? :? En waarom is het niet zinnig om met datums te gaan werken?

Ergo: pak de datum, tel er 5 weken bij op, en pak hier het weeknummer van.

[ Voor 82% gewijzigd door gorgi_19 op 22-05-2003 18:30 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Mja, ik heb nu wel een idee hoe het werkt, maar als ik een week pak, bijvoorbeeld week 21, dan moet ik daar de eerste dag nog van hebben...

Ik heb nu deze string van hierboven die goed werkt:

SELECT * FROM wedstrijden WHERE datum BETWEEN NOW() AND DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY)

maar nu moet ik van die NOW() dus niet de dag van vandaag hebben, maar de eerste dag van de week waar we nu in zitten... dus maandag 19 mei..

Iemand?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ik denk dat je een beetje op het verkeerde spoor zit. Je bedoelt feitelijk dat je de maandag en dinsdag van de huidige week wilt hebben, toch?
SQL:
1
2
3
4
5
6
7
8
SELECT 
   # ...
FROM
   # ...
WHERE
   WEEK(`datum`)=WEEK(NOW)
AND
   WEEKDAY(`datum`) IN (0,1)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

drm schreef op 22 May 2003 @ 19:01:
Ik denk dat je een beetje op het verkeerde spoor zit. Je bedoelt feitelijk dat je de maandag en dinsdag van de huidige week wilt hebben, toch?
SQL:
1
2
3
4
5
6
7
8
SELECT 
   # ...
FROM
   # ...
WHERE
   WEEK(`datum`)=WEEK(NOW)
AND
   WEEKDAY(`datum`) IN (0,1)
Nou, ik ben dus met een project bezig, en dat is een voetbalwebsite van de plaatselijke club hiero, en nu wilde ik dus het programma van de komende 5 weken weergeven , elke week in een aparte tabel, maar ik wil dus van maandag t/m zondag rekenen, en als dus weer een nieuwe week begint, ik een nieuwe tabel moet beginnen.

Maar ik wil dus geen tabel die een halve week laat zien, omdat ik NOW(); gebruik zeg maar :) dus ik wilde graag van de eerste dag van de week uitgaan, en dat is bij mijn inziens deze week maandag de 19e :)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Sunchaser:
Nou, ik ben dus met een project bezig, en dat is een voetbalwebsite van de plaatselijke club hiero, en nu wilde ik dus het programma van de komende 5 weken weergeven , elke week in een aparte tabel, maar ik wil dus van maandag t/m zondag rekenen, en als dus weer een nieuwe week begint, ik een nieuwe tabel moet beginnen.
Ik hoop dat je met 'tabel' een html table bedoelt 8)7 ;)

Ik denk dat je in dat geval beter het weeknummer mee kan selecteren:

code:
1
2
3
4
5
6
7
8
9
SELECT
   WEEK(datum) as `week_nr`,
   # ...
FROM
   wedstrijden
WHERE
   WEEK(datum) BETWEEN WEEK(NOW()) AND WEEK(NOW)+5
ORDER BY
   WEEK(datum),DAYOFWEEK(datum) # ff voor de duidelijkheid...


Vervolgens kun je met PHP aan de hand van het week_nr achterhalen of je een nieuwe tabel moet beginnen.

[ Voor 5% gewijzigd door drm op 22-05-2003 19:35 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 22 May 2003 @ 18:20:
En jouw opmerking van datums genereren ipv weeknummers is leuk, maar daar schieten we ook niks mee op.
Waarom niet? :)
Als je wilt weten wat de huidige datum kun je dat ophalen, tel daar vijf weken bij op via date_add en klaar.
Het wordt idd lastiger als je de eerste dag van de huidige week wilt hebben, dan zou het zoiets kunnen worden:

code:
1
2
3
4
datum BETWEEN
    DATE_SUB(CURRENT_DATE, INTERVAL WEEKDAY(CURRENT_DATE) DAY) 
  AND
    DATE_SUB(DATE_ADD(CURRENT_DATE, INTERVAL 35 DAY), INTERVAL WEEKDAY(CURRENT_DATE) DAY)

Voordeel met datums is natuurlijk dat je nog steeds geen geknoei met rollende weeknummers hebt.

De date_sub is het terugtellen van vandaag naar de eerste dag van de week de date_add is om 5 weken vooruit te gaan :) (7*5)
En waarom zou het schoppen van een topic als dit niet zinvol zijn? Moet ik dan een nieuwe openen met dezelfde vraag? Daar zitten ze hier op te wachten zeker...
Het is in dit geval een lastige :)
Een reactie hier is opzich ook niet erg hoor.
drm schreef op 22 May 2003 @ 19:34:
code:
1
2
3
4
5
6
7
8
9
SELECT
   WEEK(datum) as `week_nr`,
   # ...
FROM
   wedstrijden
WHERE
   WEEK(datum) BETWEEN WEEK(NOW()) AND WEEK(NOW)+5
ORDER BY
   WEEK(datum),DAYOFWEEK(datum) # ff voor de duidelijkheid...
Leuk, maar wat gebeurt er in week 51, prutser? ;) (ja dat moest van je! :-P)

[ Voor 23% gewijzigd door ACM op 22-05-2003 20:34 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

ACM:
Leuk, maar wat gebeurt er in week 51, prutser ;) (ja dat moest van je! :-P)
* drm beetje sadomasochist :+

Je hebt helemaal gelijk ik was een "beetje" te vlug :o

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Bedankt voor de reacties.. Ik heb en paar problemen met de PC dus ik reageer een beetje laat, maat ik zal er weer eens mee aan het stoeien gaan. Het ziet er allemaal wel ok uit moet ik zeggen , nu alleen nog zorgen dat het werkt :)
Pagina: 1