Datum correct weergeven (voor 1900 én onvolledig)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Karin php

Karin php

20/06/2012 11:21:56
Quote Anchor link
Ik wil een datum uit een database weergeven, liefst op een Nederlandse manier.
Bijvoorbeeld 1884-12-12 Moet worden 12 december 1884.

De strftime functie kan geen data voor 1900 aan. Een alternatief is de date/datecreate functie, maar deze is standaard engels.

Verder moet indien dag of maand ontbreekt, deze niet worden weergegeven. Bijvoorbeeld: 1884-12-00 wordt december 1884 en 1884-00-00 wordt 1884. Nu krijg ik 31 nov 1883 wat niet correct is.
 
PHP hulp

PHP hulp

17/11/2024 03:01:14
 
Marco ----

Marco ----

20/06/2012 11:26:34
Quote Anchor link
mysql_fetch_array(mysql_query("SELECT DATE_FORMAT(datum,'%d %m %Y')"))

Zelf even kijken naar quotes ed

Toevoeging op 20/06/2012 11:31:39:

Kijk ook even hier: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format

Had net niet helemaal goed gekeken. Zelf heb ik zoiets, maar misschien dat het anders/eenvoudiger kan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$maand
= array("","januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december");

$tmp_maand = mysql_fetch_array(mysql_query("SELECT MONTH(datumveld)"));

echo $maand[$tmp_maand[0]]
?>
Gewijzigd op 20/06/2012 11:32:25 door Marco ----
 
Karin php

Karin php

20/06/2012 15:58:10
Quote Anchor link
Ha Marco,

bedankt voor je reactie. Dit geeft echter nog steeds engelse data. Met een array is het op te lossen, maar dat moet toch ook anders kunnen?

voor de weergave van (onvolledige) data gebruik ik nu:

$sql = "SELECT DATE_FORMAT($date,'%e'), DATE_FORMAT($date,'%b'), DATE_FORMAT($date,'%Y') FROM tabel";
$result = mysql_query($sql);

if (mysql_num_rows($result)>0){
while ($rij =mysql_fetch_array($result)){
$day=$rij["DATE_FORMAT($date,'%e')"];
$month=$rij["DATE_FORMAT($date,'%b')"];
$year=$rij["DATE_FORMAT($date,'%Y')"];

if ($day>0){echo $day.' ';}
if ($month>0){echo $$month.' ';}
if ($year>0){echo $year.' ';}
}
}

Naar mijn mening ook veel te omslachtig.
 
Marco ----

Marco ----

20/06/2012 16:07:49
Quote Anchor link
Had je deze al geprobeerd?

SELECT DATE_FORMAT(datumveld,'%d-%m-%Y')

Dan moet je in ieder geval al dd-mm-yyyy hebben.
 
Rolf -

Rolf -

20/06/2012 16:08:43
Quote Anchor link
Hoezo heb je onvolledige data dan? Dat lijkt me niet wenselijk.

Maar als je toch onvolledige data hebt en je wil kijken of er lege tussen zitten moet je toch echt de dag, maand en jaar apart uitlezen uit je datum veld. Indien deze leeg zijn kun je er dan voor kiezen om deze leeg te laten.

Dus bijvoorbeeld SELECT DATE_FORMAT(datumveld,'%d') AS dag, DATE_FORMAT(datumveld, '%m') AS maand etc. Zo kan je dan controleren of een datum niet gelijk is aan nul. Zo niet dan aan elkaar koppelen.
Gewijzigd op 20/06/2012 16:10:11 door Rolf -
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/06/2012 17:16:30
Quote Anchor link
Het kan toch niet waar zijn! Eigenlijk zou het gewoon niet mogelijk moeten zijn om een datum zoals 2000-00-00 in een mysql te kunnen zetten. Ik had het nog nooit geprobeerd trouwens maar als het toch kan zou je dit kunnen doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    CONCAT(
        IF(DAY(datum) > 0, CONCAT(DAY(datum),'-'),''),
        CASE MONTH(datum)
            WHEN 1 THEN 'jan. '
            WHEN 2 THEN 'feb. '
            -- etcetera
            ELSE '',
        IF(YEAR(datum)>0, YEAR(datum), '')
    )
FROM
    tabel
 
Erwin H

Erwin H

20/06/2012 17:22:00
Quote Anchor link
@Ger, eigenlijk kan het ook niet, want 2000-00-00 krijg je er niet. Je kan het wel invoeren, maar MySQL ziet het dan als 1999-12-31.

Als je echt onvolledige datums wilt invoeren, dan kan je volgens mij beter met aparte kolommen gaan werken voor dag, maand en jaar. Uiteraard haal je je dan heel andere problemen op de hals (moet je bijvoorbeeld zelf de datum checken of het wel een geldige datum is), maar in elk geval kan je dan 0 invoeren voor een dag of maand.
 
 - Diov  -

- Diov -

20/06/2012 17:53:03
Quote Anchor link
Om het in nederlands te zeggen (als dat niet zo is).

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
setlocale(LC_ALL, 'nl_NL');
 
Eddy E

Eddy E

20/06/2012 18:01:25
Quote Anchor link
De Nachtwacht is in (weet ik veel) 1880 gemaakt. Dus niet precies op 17 juni 1880 om 20:12:42 .... dat is veel absurder.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/06/2012 18:11:02
Quote Anchor link
@Erwin,
Probeer het eens uit (ik heb dat gedaan) en raar maar waar, het lukt! Getest op 5.2.
Dit had ik al gedaan net na nijn eerste reactie, dus het komt er (tot mijn zeer grote verbazing) op neer dat op een of de andere manier mysql vanuit een string vertaalt. Bv staat er ook in de MySQL manual dat %m 0-31 kan zijn. Kan niet gekker worden ;-)

Voor het overige ben ik het met je eens dat indien je onvolledige datums kunt krijgen die gewoon op moet splitsen.

Toevoeging op 20/06/2012 18:13:23:

Eddy Erkelens op 20/06/2012 18:01:25:
De Nachtwacht is in (weet ik veel) 1880 gemaakt. Dus niet precies op 17 juni 1880 om 20:12:42 .... dat is veel absurder.

Ik wist niet dat Rembrandt (of was het van Gogh :P) zo snel was!
Gewijzigd op 20/06/2012 18:14:21 door Ger van Steenderen
 
Erwin H

Erwin H

20/06/2012 19:34:04
Quote Anchor link
Dan toch maar even opgezocht:
Quote:
MySQL permits you to store dates where the day or month and day are zero in a DATE or DATETIME column. This is extremely useful for applications that need to store birthdates for which you may not know the exact date. In this case, you simply store the date as '2009-00-00' or '2009-01-00'. If you store dates such as these, you should not expect to get correct results for functions such as DATE_SUB() or DATE_ADD() that require complete dates. To disallow zero month or day parts in dates, enable the NO_ZERO_IN_DATE SQL mode.

Het kan dus wel. Je kan dus incomplete datums opslaan in een DATE veld. Alleen moet je er wel rekening mee houden dat sommige berekeningen niet goed zullen werken.

Daarmee vraag ik wel af wat wijsheid is. Of toch gewoon zo opslaan, of drie kolommen ervan maken?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/06/2012 19:44:52
Quote Anchor link
3 kolommen is het beste vind ik.
Ik vind het gewoon belachelijk dat mysql dit accepteerd.
 
Roel -

Roel -

20/06/2012 20:46:23
Quote Anchor link
Marco ---- op 20/06/2012 11:26:34:
mysql_fetch_array(mysql_query("SELECT DATE_FORMAT(datum,'%d %m %Y')"))

Zelf even kijken naar quotes ed

Toevoeging op 20/06/2012 11:31:39:

Kijk ook even hier: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format

Had net niet helemaal goed gekeken. Zelf heb ik zoiets, maar misschien dat het anders/eenvoudiger kan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$maand
= array("","januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december");

$tmp_maand = mysql_fetch_array(mysql_query("SELECT MONTH(datumveld)"));

echo $maand[$tmp_maand[0]]
?>



Of:
SELECT CONCAT(DAY(datumveld), ' ', ELT(MONTH(datumveld), 'januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'), YEAR(datumveld)) AS datum_nl FROM tabel
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/06/2012 22:17:17
Quote Anchor link
Al die dingen zijn allemaal mogelijk maar HET ZOU NOOIT MOGEN WERKEN.
Probeer maar eens "INSERT INTO sometable (datum) VALUES ('2012-06-00')"
Op 99 van de 100 databses wekrkt dat gewoon niet (zoals het hoort), de honderste is dus mysql: bullocks
 
Karin php

Karin php

21/06/2012 08:58:02
Quote Anchor link
Waarom niet? soms heb je gewoon niet alle informatie. Moet je dan de rest ook maar weggooien? De standaarddatum is trouwens al 0000-00-00. MySQL behandeld data zoals die is. PHP gaat er onzin van maken. Dát zou niet mogen.

@Roel, deze functie werkt niet voor onvolledige data.
@Dem Ian, de setlocale werkt niet op deze functies.

Wat ik nu heb (heel omslachting, maar het werkt)

$x=array("dag","maand","jaar" );
foreach ($x as $variabele){
$p=array("dag"=>'%e',"maand"=>'%c',"jaar"=>'%Y',);
$maand=array('januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december');

$sql = "SELECT DATE_FORMAT($date, '$p[$variabele]') AS datumdeel FROM tabel HERE '$id'=id";
$result = mysql_query($sql);

if (mysql_num_rows($result)>0){
while ($rij2 =mysql_fetch_array($result)){
$dv=$rij2["datumdeel"];
}
}
if ($dv>0){
if ($variabele=="maand"){ echo $maand[$dv-1].' ';}
else {echo $dv.' ';}
}
}
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/06/2012 15:45:01
Quote Anchor link
Karin php op 21/06/2012 08:58:02:
Waarom niet? soms heb je gewoon niet alle informatie. Moet je dan de rest ook maar weggooien?

Nee natuurlijk niet.
Karin php op 21/06/2012 08:58:02:
De standaarddatum is trouwens al 0000-00-00. MySQL behandeld data zoals die is. PHP gaat er onzin van maken. Dát zou niet mogen.

Iedere programmeertaal maakt er onzin van, want 0000-00-00 is geen datum dus onzin.

Het lijkt mij het verstandigste om een datum die onvolledig is niet als datum te beschouwen, en hem -zoals Erwin al suggereerde- hem in 3 kolommen op te splitsen.
 
Karin php

Karin php

25/06/2012 13:24:45
Quote Anchor link
Het meest simpele is om het dag-, maand-, en jaardeel apart uit te lezen uit de string. Je beschouwt daarbij de datum als een willekeurige string, deze waarde geef je vervolgens alleen weer wanneer deze groter dan 0 is. Om de maand als nederlandse naam weer te geven kun je deze apart in een 'tijdelijke' datum stoppen en uitlezen. Je hoeft dan niet zelf een array te maken en kan makkelijk van format wisselen (%b, %B, %m of %c).


$dv=substr($rij[$date],8,2);if ($dv>0){echo $dv.' ';}
$dv=substr($rij[$date],5,2);if ($dv>0){echo strftime("%B",strtotime("1-$dv-2000")).' ';}
$dv=substr($rij[$date],0,4);if ($dv>0){echo $dv;}
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.