Interval in mysql gebruiken in php

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Hey,

Om verjaardagen te selecteren gebruik ik onderstaande query (versimpelde vorm):

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
    leden.id,
    leden.gebruikersnaam
FROM
    leden
WHERE

IF( 1 * DATE_FORMAT( DATE_SUB( CURDATE( ) , INTERVAL 4 DAY ) ,  '%c%d' ) >1 * DATE_FORMAT( leden.geboortedatum,  '%c%d' ) , 
CONCAT( 
    EXTRACT( 
        YEAR FROM 
            DATE_SUB( CURDATE( ) , INTERVAL 2 DAY ) ) +1,  '-', RIGHT( leden.geboortedatum, 5 ) ) , 
CONCAT( 
    EXTRACT( 
        YEAR FROM DATE_SUB( CURDATE( ) , INTERVAL 2 DAY ) ) ,  '-', RIGHT( leden.geboortedatum, 5 ) ) ) 
BETWEEN 
    DATE_SUB( CURDATE( ) , INTERVAL 2 DAY ) AND DATE_ADD( CURDATE( ) , INTERVAL 14 DAY )


Nu werkt dit nabehoren, echter wil ik binnen de SELECT het interval in dagen terugkrijgen. Is dit überhaupt mogelijk of moet ik dit in php afhandelen?

Het probleem in deze is dat het interval in dagen berekent moet worden zonder een jaartal (of ik moet heel moeilijk gaan doen door te controleren of de maand en dag van een geboortedatum in het komend jaar ligt (in het geval dat het nu bijv. december is en diegene jarig is in januari).

Het lijkt mij veel handiger om rechtstreeks het interval terug te krijgen, maar ik weet niet of dit überhaupt mogelijk is.

(wat ik hiermee wil bereiken is het kunnen aangeven of een verjaardag eergisteren, gisteren, vandaag, morgen of overmorgen is)

[ Voor 5% gewijzigd door radem205 op 21-02-2010 22:16 ]


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Als je het jaar niet mee wilt nemen in je verjaardag, waarom doe je dan zo moeilijk om er 1 bij te verzinnen? Je kunt het jaar ook weglaten en alleen de dag en de maand gebruiken.

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!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Janoz schreef op maandag 22 februari 2010 @ 09:30:
Als je het jaar niet mee wilt nemen in je verjaardag, waarom doe je dan zo moeilijk om er 1 bij te verzinnen? Je kunt het jaar ook weglaten en alleen de dag en de maand gebruiken.
Aangezien je met schikkeljaren en jaarovergangen zit is het mijn inziens nodig om het jaar mee te nemen in de berekening (stel: iemand is 28 februari jarig en het is een schikkeljaar. Bij een interval van 4 dagen kom je dus uit op een maximale datum van 3 maart (i.p.v. 4 maart) ).

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 01:21
Volgens mij heb je ook een jaartal nodig, al is het alleen maar voor de jaarovergangen. Het is ook niet heel moeilijk om het correct voor elkaar te krijgen. Deze query levert je bijvoorbeeld alle aankomende verjaardagen uit een set met geboortedatums:
SQL:
1
2
3
4
5
6
7
SELECT
    `birthdate`,
    if(DATE_FORMAT(CURDATE(),"%m%d")<=DATE_FORMAT(`birthdate`,"%m%d"),
        CONCAT(DATE_FORMAT(`birthdate`,"%m-%d-"),YEAR(CURDATE())),
        CONCAT(DATE_FORMAT(`birthdate`,"%m-%d-"),YEAR(CURDATE())+1)
    ) AS `upcoming`
FROM `table` ORDER BY upcoming;

Als het om veel data gaat zou ik dit niet aanraden omwille van performance. Maar verder kun je hier volgens mij wel mee wat je nodig hebt :)

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Mijn inziens heb je die alleen nodig om de dag en de maand van eergisteren en over twee weken te bepalen. De check of de verjaardagen er tussen vallen is, ook met jaar overgang, een stuk simpeler dan die string concatenatie en date conversions die je nu in je query hebt staan.

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