Mysql verjaardagen deze week
Weet iemand een manier? Die ook werk bij de schrikkeljaren en jaren voor 1970?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT *,
DAYOFMONTH ( datum ) AS dag,
MONTH ( datum ) AS maand,
(YEAR( CURRENT_DATE( ) ) - YEAR(datum)) AS leeftijd
FROM `verjaardag`
WHERE
(
DAYOFYEAR( CURRENT_DATE( ) ) > DAYOFYEAR( DATE_SUB( datum, INTERVAL 7 DAY ) )
AND DAYOFYEAR( CURRENT_DATE( ) ) <= DAYOFYEAR( DATE_SUB( datum, INTERVAL 7 DAY ) ) +7
)
OR
(
DAYOFYEAR( CURRENT_DATE( ) ) > DAYOFYEAR( datum ) -7
AND DAYOFYEAR( CURRENT_DATE( ) ) <= DAYOFYEAR( datum )
)
ORDER BY maand, dag, leeftijd ASC
DAYOFMONTH ( datum ) AS dag,
MONTH ( datum ) AS maand,
(YEAR( CURRENT_DATE( ) ) - YEAR(datum)) AS leeftijd
FROM `verjaardag`
WHERE
(
DAYOFYEAR( CURRENT_DATE( ) ) > DAYOFYEAR( DATE_SUB( datum, INTERVAL 7 DAY ) )
AND DAYOFYEAR( CURRENT_DATE( ) ) <= DAYOFYEAR( DATE_SUB( datum, INTERVAL 7 DAY ) ) +7
)
OR
(
DAYOFYEAR( CURRENT_DATE( ) ) > DAYOFYEAR( datum ) -7
AND DAYOFYEAR( CURRENT_DATE( ) ) <= DAYOFYEAR( datum )
)
ORDER BY maand, dag, leeftijd ASC
De jaren voor 1970 zijn geen enkel probleem. Tenzij jij een TIMESTAMP gebruikt, maar dan vraag je ook om problemen... Gebruik een DATETIME en dat probleem is ook weer de wereld uit.
Wanneer je niet de verjaardagen van vandaag wilt hebben, dan moet je nog even een AND toevoegen die de verjaardagen van vandaag buitensluit.
Met dit : DAYOFYEAR( datum ) > (DAYOFYEAR( CURRENT_DATE )+1) lukt dat niet want in een schrikkeljaar veranderd dit.
Zit me hier suf te piekeren hoe ik dit aan zal pakken en met Google kom ik ook niet verder.
Ik maak trouwens gebruik van een DATE field dus dat zit dacht ik wel goed.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$sql = "
SELECT
naam,
CONCAT(YEAR(geboortedatum) , DATE_FORMAT(geboortedatum, '-%m-%d')) AS verjaardag_dit_jaar
FROM verjaardag
WHERE WEEK(CURDATE()) = WEEK(CONCAT(YEAR(geboortedatum) , DATE_FORMAT(geboortedatum, '-%m-%d')))
AND CURDATE() != CONCAT(YEAR(geboortedatum) , DATE_FORMAT(geboortedatum, '-%m-%d'))";
?>
$sql = "
SELECT
naam,
CONCAT(YEAR(geboortedatum) , DATE_FORMAT(geboortedatum, '-%m-%d')) AS verjaardag_dit_jaar
FROM verjaardag
WHERE WEEK(CURDATE()) = WEEK(CONCAT(YEAR(geboortedatum) , DATE_FORMAT(geboortedatum, '-%m-%d')))
AND CURDATE() != CONCAT(YEAR(geboortedatum) , DATE_FORMAT(geboortedatum, '-%m-%d'))";
?>
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
Dit is niet de oplossing tot mijn probleem volgens mij?
Waarom gebruik je CONCAT? Je haalt nu heel omslachtig YYYY-MM-DD uit een DATE field? Maar met CURDATE doe je toch hetzelfde? En wat doet WEEK dan voor jouw, precies?
Even mijn voorbeeld duidelijker formuleren:
De opbouw van de tabel is :
CREATE TABLE `verjaardag` (
`id` int(8) NOT NULL auto_increment,
`datum` date NOT NULL default '0000-00-00',
`lid` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`) ) TYPE=MyISAM;
En een deel van de data:
1955-10-26 André Dubbeldam
1988-10-26 Cornélie van Houwelingen
1985-10-26 Linda van Wijngaarden
1960-10-27 Janny Visscher
1960-10-29 Leo Visscher
1950-10-30 Geertje van Kooten
1980-10-31 Jeroen van Andel
2005-11-01 Test naam
1984-11-03 Jurgen Adriaanse
1990-11-07 Hanna van der Ham
Met jouw(Jan) query krijg ik het volgende :
André Dubbeldam 1955-10-26
Cornélie van Houwelingen 1988-10-26
Janny Visscher 1960-10-27
Leo Visscher 1960-10-29
Jeroen van Andel 1980-10-31
Je ziet een jarige in het verleden (gisteren) en de jarige "Test naam" valt toch ook binnen een week?
In feite wil ik alle jarigen binnen nu en zeven dagen en niet die van vandaag. Met die van vandaag wil ik iets anders gaan doen....
@Frank
De reden van dat 1970 erbij zet is dat niemand met het advies van UNIX_TIMESTAMP komt.
Wat die backtopics betreft, waarom geeft PHPMyadmin dit wel? Het werkt ook zonder oke maar snap je opmerking niet zo.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
$sql = "
SELECT
user, geboortedatum
FROM
users
WHERE
DATE_ADD( geboortedatum, INTERVAL( YEAR( CURDATE( ) ) - YEAR( geboortedatum ) ) YEAR )
BETWEEN
NOW( )
AND
DATE_ADD( NOW( ) , INTERVAL 7 DAY ) ;
";
$res = mysql_query($sql) or die("fout:<br />SQL:<br /><pre> ".$sql."</pre><br />Fout:<br />".mysql_error()."<br />ERRNO: <br />".mysql_errno());
if (mysql_num_rows($res) != 1)
{
echo '<h1>Jarigen komende week:</h1>';
}
else
{
echo '<h1>Jarige komende week: </h1>';
}
echo '<p>';
if (mysql_num_rows($res) > 0)
{
while ($rij = mysql_fetch_assoc($res))
{
if (isset($_SESSION['userlogin']))
{
echo '<a href="http://www.xxx.nl?p=profiel&id='.$rij['id'].'">';
}
echo $rij['user'];
if (isset($_SESSION['userlogin']))
{
echo '</a>';
}
echo ' is jarig op '.$rij['geboortedatum'].'. <br />'."\n";
}
}
else
{
echo '<i>Geen jarigen</i>';
}
echo "\n</p>\n";
echo "\n<p>\n";
$sql2 ="
SELECT user,id,geboortedatum,
CASE
WHEN MONTH( geboortedatum ) < MONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) +1, DATE_FORMAT( geboortedatum, '-%m-%d' ) )
WHEN MONTH( geboortedatum ) > MONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) , DATE_FORMAT( geboortedatum, '-%m-%d' ) )
WHEN MONTH( geboortedatum ) = MONTH( CURDATE( ) )
THEN
CASE
WHEN DAYOFMONTH( geboortedatum ) < DAYOFMONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) +1, DATE_FORMAT( geboortedatum, '-%m-%d' ) )
WHEN DAYOFMONTH( geboortedatum ) >= DAYOFMONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) , DATE_FORMAT( geboortedatum, '-%m-%d' ) )
END
END AS volgende_verjaardag
FROM users
ORDER BY volgende_verjaardag ASC
LIMIT ".mysql_num_rows($res).",5
";
$res2 = mysql_query($sql2) or die("fout:<br />SQL:<br /><pre> ".$sql2."</pre><br />Fout:<br />".mysql_error()."<br />ERRNO: <br />".mysql_errno());
if (mysql_num_rows($res2) > 0)
{
echo '<h1>Volgende 5 jarigen:</h1>';
}
echo '<ul>';
while ($rij2 = mysql_fetch_assoc($res2))
{
echo '<li>';
if (isset($_SESSION['userlogin']))
{
echo '<a href="http://www.xxx.nl?p=profiel&id='.$rij2['id'].'">'.$rij2['user'].'</a>';
}
else
{
echo $rij2['user'];
}
echo ' is jarig op '.$rij2['volgende_verjaardag'].'</li>'."\n";
}
?>
$sql = "
SELECT
user, geboortedatum
FROM
users
WHERE
DATE_ADD( geboortedatum, INTERVAL( YEAR( CURDATE( ) ) - YEAR( geboortedatum ) ) YEAR )
BETWEEN
NOW( )
AND
DATE_ADD( NOW( ) , INTERVAL 7 DAY ) ;
";
$res = mysql_query($sql) or die("fout:<br />SQL:<br /><pre> ".$sql."</pre><br />Fout:<br />".mysql_error()."<br />ERRNO: <br />".mysql_errno());
if (mysql_num_rows($res) != 1)
{
echo '<h1>Jarigen komende week:</h1>';
}
else
{
echo '<h1>Jarige komende week: </h1>';
}
echo '<p>';
if (mysql_num_rows($res) > 0)
{
while ($rij = mysql_fetch_assoc($res))
{
if (isset($_SESSION['userlogin']))
{
echo '<a href="http://www.xxx.nl?p=profiel&id='.$rij['id'].'">';
}
echo $rij['user'];
if (isset($_SESSION['userlogin']))
{
echo '</a>';
}
echo ' is jarig op '.$rij['geboortedatum'].'. <br />'."\n";
}
}
else
{
echo '<i>Geen jarigen</i>';
}
echo "\n</p>\n";
echo "\n<p>\n";
$sql2 ="
SELECT user,id,geboortedatum,
CASE
WHEN MONTH( geboortedatum ) < MONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) +1, DATE_FORMAT( geboortedatum, '-%m-%d' ) )
WHEN MONTH( geboortedatum ) > MONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) , DATE_FORMAT( geboortedatum, '-%m-%d' ) )
WHEN MONTH( geboortedatum ) = MONTH( CURDATE( ) )
THEN
CASE
WHEN DAYOFMONTH( geboortedatum ) < DAYOFMONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) +1, DATE_FORMAT( geboortedatum, '-%m-%d' ) )
WHEN DAYOFMONTH( geboortedatum ) >= DAYOFMONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) , DATE_FORMAT( geboortedatum, '-%m-%d' ) )
END
END AS volgende_verjaardag
FROM users
ORDER BY volgende_verjaardag ASC
LIMIT ".mysql_num_rows($res).",5
";
$res2 = mysql_query($sql2) or die("fout:<br />SQL:<br /><pre> ".$sql2."</pre><br />Fout:<br />".mysql_error()."<br />ERRNO: <br />".mysql_errno());
if (mysql_num_rows($res2) > 0)
{
echo '<h1>Volgende 5 jarigen:</h1>';
}
echo '<ul>';
while ($rij2 = mysql_fetch_assoc($res2))
{
echo '<li>';
if (isset($_SESSION['userlogin']))
{
echo '<a href="http://www.xxx.nl?p=profiel&id='.$rij2['id'].'">'.$rij2['user'].'</a>';
}
else
{
echo $rij2['user'];
}
echo ' is jarig op '.$rij2['volgende_verjaardag'].'</li>'."\n";
}
?>
Roverts schreef op 27.10.2006 15:09:
@ Jan
Dit is niet de oplossing tot mijn probleem volgens mij?
Waarom gebruik je CONCAT? Je haalt nu heel omslachtig YYYY-MM-DD uit een DATE field? Maar met CURDATE doe je toch hetzelfde? En wat doet WEEK dan voor jouw, precies?
Dit is niet de oplossing tot mijn probleem volgens mij?
Waarom gebruik je CONCAT? Je haalt nu heel omslachtig YYYY-MM-DD uit een DATE field? Maar met CURDATE doe je toch hetzelfde? En wat doet WEEK dan voor jouw, precies?
Ik neem aan dat in dat DATE field de geboortedatum van een persoon staat? Dan geeft die CONCAT die ik gebruik de verjaardag in het huidige jaar. Heb je de query uitgetest? Uit je "volgens mij" maak ik op van niet?
Quote:
Met jouw(Jan) query krijg ik het volgende :
André Dubbeldam 1955-10-26
Cornélie van Houwelingen 1988-10-26
Janny Visscher 1960-10-27
Leo Visscher 1960-10-29
Jeroen van Andel 1980-10-31
Je ziet een jarige in het verleden (gisteren) en de jarige "Test naam" valt toch ook binnen een week?
In feite wil ik alle jarigen binnen nu en zeven dagen en niet die van vandaag. Met die van vandaag wil ik iets anders gaan doen....
André Dubbeldam 1955-10-26
Cornélie van Houwelingen 1988-10-26
Janny Visscher 1960-10-27
Leo Visscher 1960-10-29
Jeroen van Andel 1980-10-31
Je ziet een jarige in het verleden (gisteren) en de jarige "Test naam" valt toch ook binnen een week?
In feite wil ik alle jarigen binnen nu en zeven dagen en niet die van vandaag. Met die van vandaag wil ik iets anders gaan doen....
Zo heb je je vraag niet geformuleerd aan het begin van je topic! Je vroeg dit:
Quote:
Ik wil met onderstaande query de verjaardagen van deze week halen, behalve vandaag. Maar helaas lukt het niet om de verjaardagen van vandaag over te slaan.
De verjaardagen van deze week betekent: als het nu woensdag is, alle verjaardagen vanaf maandag tot zondag, behalve woensdag. Je kunt de week ook op zondag beginnen eventueel. Als je de verjaardagen van de komende zeven dagen wilt, is dat een andere query.
Quote:
Ik neem aan dat in dat DATE field de geboortedatum van een persoon staat? Dan geeft die CONCAT die ik gebruik de verjaardag in het huidige jaar. Heb je de query uitgetest? Uit je "volgens mij" maak ik op van niet?
In het DATE field staan idd de geboortedata. De query heb ik getest en heb ik hierboven geplaatst.
@Boris();
Ik zal hem gaan testen ziet er leuk uit, kan ik best wat mee. Maar ik zie nergens de filter om vandaag uit te sluiten?
Top dat is hem, het lijkt zo logisch als je het ziet staan, maar kon er niet opkomen. Bedankt voor de hulp!!!
Okee, graag gedaan :-)
Mijn output is :
Volgende speeldag
2015-01-14-18:00:00-Elite-Wit - Groen
2015-01-14-18:30:00-U11-Geel - Rood
2015-01-16-18:00:00-U7-Geel - Oranje
2015-01-16-18:00:00-U21-Groen - Paars
2015-01-16-18:00:00-U11-Bruin - Wit
2015-01-16-19:30:00-U8-Zwart - Grijs
2015-01-16-22:00:00-Elite-Oranje - Geel
Nu zou ik het graag zo hebben dat het per kalenderdag gegroepeerd wordt, gesorteerd op uur en reeks.
D d F Y
uur (00:00)- Reeks - thuisploeg - Bezoekers
uur (00:00)- Reeks - thuisploeg - Bezoekers
uur (00:00)- Reeks - thuisploeg - Bezoekers
.....
D d F Y
uur (00:00)- Reeks - thuisploeg - Bezoekers
uur (00:00)- Reeks - thuisploeg - Bezoekers
.....
Kan iemand mij hiermee helpen?
Hoe kan ik de datum in het nederlands krijgen en het uur zonder de seconden.
Alvast bedankt voor de hulp.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
// Create connection
$conn = new mysqli($host, $username, $password, $db);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT id, datum, uur, reeks, thuisploeg, bezoekers, CONCAT( YEAR( CURDATE( ) ) , DATE_FORMAT( datum, '-%m-%d' ) )
FROM wedstrijden
WHERE CONCAT( YEAR( CURDATE( ) ) , DATE_FORMAT( datum, '-%m-%d' ) )
BETWEEN DATE_ADD( CURDATE( ) , INTERVAL 1
DAY )
AND DATE_ADD( CURDATE( ) , INTERVAL 8
DAY)
ORDER BY `datum` ASC, `uur` ASC, `reeks` DESC ";
$result = $conn->query($sql);
echo "Volgende speeldag<br>";
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "" . $row["datum"]. "-" . $row["uur"]."-" . $row["reeks"]."-" . $row["thuisploeg"]." - " . $row["bezoekers"]. "<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>
// Create connection
$conn = new mysqli($host, $username, $password, $db);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT id, datum, uur, reeks, thuisploeg, bezoekers, CONCAT( YEAR( CURDATE( ) ) , DATE_FORMAT( datum, '-%m-%d' ) )
FROM wedstrijden
WHERE CONCAT( YEAR( CURDATE( ) ) , DATE_FORMAT( datum, '-%m-%d' ) )
BETWEEN DATE_ADD( CURDATE( ) , INTERVAL 1
DAY )
AND DATE_ADD( CURDATE( ) , INTERVAL 8
DAY)
ORDER BY `datum` ASC, `uur` ASC, `reeks` DESC ";
$result = $conn->query($sql);
echo "Volgende speeldag<br>";
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "" . $row["datum"]. "-" . $row["uur"]."-" . $row["reeks"]."-" . $row["thuisploeg"]." - " . $row["bezoekers"]. "<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$result = $conn->query($sql);
echo "Volgende speeldag<br>";
if ($result->num_rows > 0) {
$date_heading = '';
while($row = $result->fetch_assoc()) {
if ($date_heading != $row['datum']) {
echo '<h3>' . $row['datum'] . '</h3>';
$date_heading = $row['datum'];
}
echo "" . $row["datum"]. "-" . $row["uur"]."-" . $row["reeks"]."-" . $row["thuisploeg"]." - " . $row["bezoekers"]. "<br>";
}
} else {
echo "0 results";
}
?>
$result = $conn->query($sql);
echo "Volgende speeldag<br>";
if ($result->num_rows > 0) {
$date_heading = '';
while($row = $result->fetch_assoc()) {
if ($date_heading != $row['datum']) {
echo '<h3>' . $row['datum'] . '</h3>';
$date_heading = $row['datum'];
}
echo "" . $row["datum"]. "-" . $row["uur"]."-" . $row["reeks"]."-" . $row["thuisploeg"]." - " . $row["bezoekers"]. "<br>";
}
} else {
echo "0 results";
}
?>
Koshi koshi op 12/01/2015 22:42:54:
Ik zou deze code willen gebruiken om op mijn site de volgende wedstrijden aan te kondigen.
Ik zie het verband niet tussen verjaardagen en een wedstrijdprogramma.
Ik denk dat je beter een nieuw topic kan starten.
Daarnaast is de hier geboden oplossing niet correct.
Code (php)
1
2
2
WHERE CONCAT(YEAR(CURDATE()) , DATE_FORMAT(geboortedatum, '-%m-%d'))
BETWEEN DATE_ADD(CURDATE() , INTERVAL 1 DAY) AND DATE_ADD(CURDATE() , INTERVAL 8 DAY)
BETWEEN DATE_ADD(CURDATE() , INTERVAL 1 DAY) AND DATE_ADD(CURDATE() , INTERVAL 8 DAY)
Dit zal van 24 t/m 31 december onjuiste resultaten opleveren, als bv op 30 december 2014 dit wordt uitgevoerd, krijgt iemand geboren op 1980-01-02 de datum 2014-01-02, hetgeen resulteert in
De oplossing is om een serie met datums te generen en dan de tabel te joinen op maand-dag:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
u.first_name,
u.last_name,
d.ref_date,
TIMESTAMPDIFF(YEAR, u.birth_date, d.ref_date) age
FROM
(
SELECT
@ref_date := @ref_date + INTERVAL 1 DAY ref_date
FROM
(SELECT 1 x UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7) s
CROSS JOIN
(SELECT @ref_date := CURRENT_DATE) v
) d
JOIN
users u
ON DATE_FORMAT(d.ref_date, '%m-%d') = DATE_FORMAT(u.birth_date, '%m-%d')
u.first_name,
u.last_name,
d.ref_date,
TIMESTAMPDIFF(YEAR, u.birth_date, d.ref_date) age
FROM
(
SELECT
@ref_date := @ref_date + INTERVAL 1 DAY ref_date
FROM
(SELECT 1 x UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7) s
CROSS JOIN
(SELECT @ref_date := CURRENT_DATE) v
) d
JOIN
users u
ON DATE_FORMAT(d.ref_date, '%m-%d') = DATE_FORMAT(u.birth_date, '%m-%d')
Ik weet dat dit al een oud topic is, maar dit verjaart niet.
Gewijzigd op 20/01/2015 12:49:01 door Ger van Steenderen