[php/mysql] alle verjaardagen binnen een week

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • kroeske
  • Registratie: Mei 2000
  • Laatst online: 05-06 09:27
Ik probeer om van alle ingeschreven mensen in een systeem de jarigen eruit te halen van de huidige week, nu probeer ik dat dmv de huidige query:
PHP:
1
$mysql->query("SELECT id, vnaam, anaam, email, WEEK( gdatum, 2 ) as weeknr, DATE_FORMAT(gdatum, '%d-%m-%Y') as datum FROM kandidaten WHERE WEEK( gdatum, 2 )  = ".$week." order by datum asc ");


gdatum is het veld met daarin de geboortedatum opgeslagen in een datetime field. en $week = date("W");

je zou verwachten dat dit werkt (ik wel in ieder geval) alleen krijg ik als ik vandaag bijvoorbeeld kijk; alle verjaardagen tussen 1 en 12 maart, een beetje lange week dus.

weet iemand waar dit aan ligt/ hoe ik dit oplos?

Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Een week bevat elk jaar andere datums.

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • kroeske
  • Registratie: Mei 2000
  • Laatst online: 05-06 09:27
justmental schreef op 03 maart 2004 @ 12:26:
Een week bevat elk jaar andere datums.
mja, maar dat is niet echt relevant denk ik, aangezien er alleen naar de huidige week gekeken hoeft te worden.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik zou persoonlijk liever de verjaardagen van de komende 7 dagen opvragen dan die van 'deze week'. En dat zou ik dan aanpakken door met DATEDIFF te kijken of de datum tussen now() en now() + 7 dagen ligt.
Kijk hier anders eens voor wat meer mogelijkheden met data in MySQL.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Ik werk zelf altijd met een timestamp (in een INT veld).
Dus dan staat er een integer in van tien getallen:
1078313141 (ongeveer half 1 vandaag).

Als ik dan alle 'jarigen' van deze week zou willen hebben dan kun je die selecteren met een query als:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// begin datum (timestamp) van deze week definieren
// kan op verschillende manieren, bijv. met mktime()..
$beginWeekDate = 'blaat';

// eind datum (timestamp) van deze week definieren
// kan op verschillende manieren, bijv. met mktime()..
$eindWeekDate = 'blaat';

$sql = "
    SELECT
           *
    FROM
           tabel
    WHERE
           gdatum > '" . $beginWeekDate . "'
    AND 
           gdatum < " . $eindWeekDate
          ;

[ Voor 10% gewijzigd door Verwijderd op 03-03-2004 12:32 ]


Acties:
  • 0 Henk 'm!

  • kroeske
  • Registratie: Mei 2000
  • Laatst online: 05-06 09:27
het idee van DATEDIFF heb ik ook al de revue laten paseren, maar daar wil mn baas niet aan beginnen, aangezien deze dan niet weet of het deze week al gebeurd is.

het idee van timestamp is inderdaad makkelijker, probleem daarmee is alleen dat het niet verder dan 1-1-1970 terug loopt, en er wel mensen zijn die ouder dan 35 zijn ;)

opzich werkt mn query wel, alleen geeft deze 12 dagen terug ipv 7 8)7

Acties:
  • 0 Henk 'm!

  • Jelle Niemantsverdriet
  • Registratie: Februari 2000
  • Laatst online: 21:23
Verwijderd schreef op 03 maart 2004 @ 12:31:
Als ik dan alle 'jarigen' van deze week zou willen hebben dan kun je die selecteren met een query als
Dan selecteer je alle mensen met een geboortedatum die de komende week is.

Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

kroeske schreef op 03 maart 2004 @ 12:28:
mja, maar dat is niet echt relevant denk ik, aangezien er alleen naar de huidige week gekeken hoeft te worden.
Niet relevant?
Je kijkt naar de week binnen de geboortejaren.
Je wilt naar het huidige jaar kijken.

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • kroeske
  • Registratie: Mei 2000
  • Laatst online: 05-06 09:27
justmental schreef op 03 maart 2004 @ 12:37:
[...]

Niet relevant?
Je kijkt naar de week binnen de geboortejaren.
Je wilt naar het huidige jaar kijken.
ow wacht, er begint wat te dagen.... sorry ik begreep je verkeerd. inderdaad wel stom dat ik daar niet aan gedacht heb. nu nog een oplossing hiervoor.
zou ik dan ipv op weeknummer selecteren gewoon de datum moeten pakken van begin en eind van de week of kan het anders/beter/efficienter?

Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 18-09 23:26

Tjark

DON'T PANIC

Wat je eigenlijk wil weten is of er mensen zijn die in de aankomende week een jaar ouder zijn/worden dan dat ze nu zijn.

(let op: tis mssql, geen mysql)
code:
1
2
3
4
SELECT TOP 10 user.name 
FROM   user 
WHERE  (FLOOR(DATEDIFF(d, user.birth_date, GETDATE() + 20) / 365.25) <> FLOOR(DATEDIFF(d, user.birth_date, GETDATE() - 2) / 365.25))
ORDER BY DATEPART([dy], user.birth_date)


dus waar de leeftijd over 20 dagen niet gelijk is aan de leeftijd van eergisteren (-2). (datediff(d,datum1,datum2) geeft het aantal dagen. Dat delen door 265.25 geeft jaren, en dat ff netjes afronden naar beneden)

Alleen werkt dit niet goed rond eind december/begin januari (ligt aan de order by zo te zien). Voor rond die tijd zou je een 2e query moeten maken.

Als iemand 't wel in 1 query kan doen: laat 't weten!

[ Voor 32% gewijzigd door Tjark op 03-03-2004 12:48 ]

*insert signature here


Acties:
  • 0 Henk 'm!

Verwijderd

MySQL:
1
2
3
4
5
6
7
8
9
SELECT       id, 
             vnaam, 
             anaam, 
             email, 
             WEEK( gdatum, 2 ) AS weeknr, 
             DATE_FORMAT(gdatum, '%d-%m-%Y') AS datum 
FROM         kandidaten 
WHERE        WEEK(CONCAT(YEAR(NOW()), SUBSTRING(gdatum, 4, 6)), 2)  = week 
ORDER BY     datum ASC


Zo pak je volgens mij wel de goede week (dus van het huidige jaar in plaats van het geboortejaar...) of niet?

Acties:
  • 0 Henk 'm!

  • kroeske
  • Registratie: Mei 2000
  • Laatst online: 05-06 09:27
het is vast niet de allermooiste oplossing, maar ik heb het nu uiteindelijk zo opgelost:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$nu = time();
$h['uren'] = date("H");
$h['mins'] = date("i");
$h['secs'] = date("s");
$h['dagvdweek'] = date("w");
$tot_secs = (($h['dagvdweek']-1)*24*60*60)+($h['uren']*60*60)+($h['mins']*60)+$h['secs'];
$beginvdweek = $nu-$tot_secs;
for($i = 1; $i < 8; $i++){
    $h_add_query .= " OR gdatum like '%". date("m-d", $beginvdweek+(60*60*24*$i))."'";
}
$datetimebeginweek = date("m-d", $beginvdweek);
$mysql->query("SELECT id, vnaam, anaam, email, DATE_FORMAT(gdatum, '%d-%m-%Y') as datum FROM b4j_kandidaten WHERE gdatum = '%$datetimebeginweek' $h_add_query order by datum asc ");

Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 18-09 23:26

Tjark

DON'T PANIC

Maar nu heb je ze dus niet op volgorde van verjaardag gesorteerd.

want iemand van 28 december komt na 2 januari te staan.

*insert signature here


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

[laat maar]

[ Voor 99% gewijzigd door Bosmonster op 03-03-2004 15:00 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Kijk eens naar de bestaande datum en tijd functies in MySql. Date("W") meesturen is al overbodig.

http://www.mysql.com/doc/en/Date_and_time_functions.html
Pagina: 1