[MySQL] Varchar (dd-mm-yyyy) omzetten naar Date (yyyy-mm-dd)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Vinze
  • Registratie: Augustus 2006
  • Laatst online: 20-09 09:35
Ik heb een aantal datums opgeslagen in mijn database, nu staan deze wegens slecht programmeren in een varchar datatype veld. Aangezien er nu ook gerekend moet worden met deze datums wil ik het graag omzetten naar het daarvoor bedoelde datatype date. Het probleem waar ik echter tegenaan loop is dat de datums opgeslagen zijn in het dd-mm-yyyy formaat, en zodra ik er een date veld van maakt wordt dit 0000-00-00.

Volgens mij moet ik dus eerst het formaat in yyyy-mm-dd zetten, en daarna pas het datatype aanpassen om de originele datums te behouden.
Alleen ik kom er niet helemaal uit hoe ik dit netjes kan doen, wat ik heb geprobeerd:

PHP:
1
2
3
4
5
6
7
8
9
10
$database = new Database();
// Dit is mijn database class en zorgt voor de database functies.

$sql = "SELECT `ID`,`datum` FROM `logboek`";
foreach($database->Select($sql) as $item) {
    $date = explode("-",$item["datum"]);
    $newdate = $date[2] . "-" . $date[1] . "-" . $date[0];
    $sql = "UPDATE `logboek` SET `datum`='" . $newdate . "' WHERE `ID`='" . $item["ID"] . "'";
    $database->Query($sql);
}

Nu werkt dit wel, maar volgens mij is het niet echt een nette manier, dus heb ik gekeken of het ook alleen met behulp van MySQL kon toen kwam ik op het volgende uit:
MySQL:
1
UPDATE logboek SET `datum` = DATE_FORMAT(`datum`,'%Y-%m-%d');

De query wordt succesvol uitgevoerd, maar vervolgens staat er in elk veld NULL, niet het gewenste resultaat dus. Kunnen jullie me misschien vertellen hoe ik dit het beste kan oplossen?

Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
http://dev.mysql.com/doc/...-and-time-functions.html:

DATE_FORMAT() Format date as specified

die gaat dus van datum naar string. Probeer het eens met

STR_TO_DATE() Convert a string to a date

Acties:
  • 0 Henk 'm!

  • Vinze
  • Registratie: Augustus 2006
  • Laatst online: 20-09 09:35
Dat was de oplossing, bedankt! :)
Ik kwam die STR_TO_DATE door te Googelen ook tegen, dacht alleen dat het daar over die PHP functie ging :X

In ieder geval, hier de oplossing:
MySQL:
1
2
UPDATE `logboek` SET `datum` = STR_TO_DATE(`datum`,'%d-%m-%Y');
ALTER TABLE  `logboek ` CHANGE  `datum`  `datum` DATE NOT NULL;

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Even voor de goede orde: Een date heeft geen "naar Date (yyyy-mm-dd)" formaat: Getallen en talstelsels FAQ - Datums. Dat de tool van je keuze 't toevallig zo laat zien is iets anders (zie ook Getallen en talstelsels - Representatie en opslag).

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Meestal ben ik vrij genadig met datum input en doe ik het in zo'n vorm:
PHP:
1
2
$date = (!empty($date) && is_string($date)) ? date("Y-m-d", strtotime($date)) : $date;
$date = (!empty($date) && (ctype_digit($date) || is_int($date)) ? date("Y-m-d", $date) : $date;


Dit geeft in iig deze notaties de goede conversie: d-m-Y, Y-m-d, timestamp