[php] Datum omzet probleem

Pagina: 1
Acties:
  • 265 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een script dat vanuit een (met access gemaakt) csv file een database vult. Heel mooi, alleen loop ik nu tegen het probleen aan dat ik veld birthdate niet kan invoeren als type date of timestamp.

Dit is het formaat wat nigevoerd wordt: 7-2-2004 0:00:00
Maar het kan ook: 7-12-2004 0:00:00 zijn

Dit moet dus omgezet worden naar formaat: 2004-02-07 om hem goed in mn database te krijgen.
Ik heb daarvoor deze code geschreven, maar omdat het om meer dan 300.000 personen gaat die in die database staan, duut dit een eeuwigheid:

code:
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
$sql=mysql_query("SELECT birthday FROM person");
while($row=mysql_fetch_array($sql))
    {
    
    $d = substr($row[birthdate], 0, 2); 
    if(substr($d,1)=="-")
        {
            $d="0".substr($d,0); 
            $m=substr($row[birthdate], 2, 4);
            if(substr($m,1)=="-")
                {
                    $m="0".substr($m,0);
                    $j=substr($row[birthdate],4,8);
                } else
                {
                $j=substr($row[birthdate],5,9);
                }
                
        }else
        {
        $m=substr($row[birthdate], 3, 5);
            if(substr($m,1)=="-")
                {
                    $m="0".substr($m,0);
                    $j=substr($row[birthdate],5,9);
                } else
                {
                $j=substr($row[birthdate],6,10);
                }
        }
        
        
        $geb=$j.$m.$d;
        mysql_query("UPDATE person SET gebdat='$geb' WHERE personid='$row[personid]'");
    }


Is er een manier dit sneller te doen? Tijden het verwerken van de csv naar de mysql database is dit niet mogelijk. Ik gebruik daarvoor dit scriptje:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 mysql_connect($db_Hostname[$i], $db_UserName[$i], $db_Password[$i])or die(mysql_error());
            mysql_select_db($db_Database[$i]);

         
            $del = "DELETE FROM ".$db_Table[$i];

            
            $sql = "LOAD DATA INFILE '$db_File[$i]' REPLACE INTO TABLE ".$db_Table[$i]." FIELDS TERMINATED BY '$db_Terminated[$i]'";


            if (mysql_query ($del) and mysql_query ($sql)) {
            $sql2=mysql_query("SELECT * FROM $db_Table[$i] ");
         $num=mysql_num_rows($sql2); 
                $message = "<font color=green>Met succes $num files geupdated in table $db_Table[$i]</font><br><BR>";
                }
            else {
                $message = "<font color=red>Foutje tijdens update table $db_Table[$i]: ". mysql_error ()."</font><BR>";
                }

Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21:03
Check dit effe.. moet je vast helpen.

Acties:
  • 0 Henk 'm!

  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 19-09 19:14
Ik weet niet of het sneller is, maar je zou misschien beter explode kunnen gebruiken, op de spatie exploden.
Dan nog een keer exploden op het - teken, dan heb je een array met 3 variabelen.

1 = dag of maand
2 = maand of dag
3 = jaar

edit: verkeerde functie, verbeterd...

[ Voor 14% gewijzigd door vriesdude op 05-01-2005 12:03 ]

/dev/null


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
vriesdude schreef op woensdag 05 januari 2005 @ 12:01:
Ik weet niet of het sneller is, maar je zou misschien beter explode kunnen gebruiken, op de spatie exploden.
Dan nog een keer exploden op het - teken, dan heb je een array met 3 variabelen.

1 = dag of maand
2 = maand of dag
3 = jaar

edit: verkeerde functie, verbeterd...
Hmm dit zou nog wel eens kunnen werken. Ik probeer het even

Acties:
  • 0 Henk 'm!

  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 19-09 19:14
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

$datum = explode(" ",$row[birthdate]);
$array = explode("-", $datum[0]);

$dag = $array[0];
$maand = $array[1];
$jaar = $array[2];

//
// Voorbeeldje
//

echo "<pre>";
print_r($array);
echo "</pre>";

?>


Was al bezig met een voorbeeld scriptje O-)

[ Voor 25% gewijzigd door vriesdude op 05-01-2005 12:08 ]

/dev/null


Acties:
  • 0 Henk 'm!

Verwijderd

Effe uit het hoofd:

PHP:
1
$date=implode('-',array_reverse(explode('-',$date,3)));

Of zoiets...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
vriesdude schreef op woensdag 05 januari 2005 @ 12:07:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

$datum = explode(" ",$row[birthdate]);
$array = explode("-", $datum[0]);

$dag = $array[0];
$maand = $array[1];
$jaar = $array[2];

//
// Voorbeeldje
//

echo "<pre>";
print_r($array);
echo "</pre>";

?>


Was al bezig met een voorbeeld scriptje O-)
okey, thanx, dit werkt goed, alleen moet er nu een 0 voor komen te staan als de lengte 1 is van een variable, om hem zo in de database te kunnen zetten.

Dat doe ik maar doe:

if(strlen($dag)=="1")
{
$dag="0".$dag;
}


Kan dat ook nog sneller?

Het script is nu nog steeds erg langzaam, maar het heeft wel wat geholpen. Tsja, het scriptje wordt 300.000x uitgevoerd. Echt snel kan dat niet zijn.....

[ Voor 27% gewijzigd door Verwijderd op 05-01-2005 12:26 . Reden: strln --> strlen ]


Acties:
  • 0 Henk 'm!

  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 26-04-2024
Wat dacht je van gebruik maken van de standaard PHP en Mysql functies :? Dit moet eenvoudig op te lossen zijn met strotime() zoals depl0y hier al aangeeft. Vervolgens heeft mysql een handige functie genaamd from_unixtime() waarmee je een unix timestamp om kan zetten naar de timestamp die jij wilt hebben...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ludo schreef op woensdag 05 januari 2005 @ 12:29:
[...]
Wat dacht je van gebruik maken van de standaard PHP en Mysql functies :? Dit moet eenvoudig op te lossen zijn met strotime() zoals depl0y hier al aangeeft. Vervolgens heeft mysql een handige functie genaamd from_unixtime() waarmee je een unix timestamp om kan zetten naar de timestamp die jij wilt hebben...
Kun je een voorbeeld geven?

Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21:03
PHP:
1
$date = date("Y-m-d H:i:s", strtotime("7-2-2004 0:00:00"));


edit : ok, dat werkt niet, daar komt "2012-07-27 00:00:00" uit.

[ Voor 41% gewijzigd door sorted.bits op 05-01-2005 13:12 ]


Acties:
  • 0 Henk 'm!

Verwijderd

mmm. waarschijnlijk mis ik heel de essentie van het probleem, maar zoals ik het nu begrijp wil je een tijd omzetten naar de goede notatie voor in de DB.

dit kan idd door gebruik te maken van date() icm. strtotime. Er is echter een probleem, strtotime verwacht een datun in de amerikaanse notatie, vandaar dat het voorbeeld van deploy niet werkt:

code:
1
2
3
4
<?
$date = "7-2-2004 0:00:00"; //europese notatie
print date("Y-m-d H:m", strtotime($date));
?>


Het enige dat je dan naar mijn idee hoeft te doen is 7-2-2004 om te draaien, want het volgende werkt prima:

code:
1
2
3
4
<?
$date = "2004-2-7 0:00:00"; //amerikaanse notatie
print date("Y-m-d H:m", strtotime($date));
?>


die nullenr ban 02 en 07 zet hij er dan automatisch bij.

Ik hoop dat je er wat aan hebt :>

[ Voor 6% gewijzigd door Verwijderd op 05-01-2005 13:24 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 05 januari 2005 @ 13:24:
mmm. waarschijnlijk mis ik heel de essentie van het probleem, maar zoals ik het nu begrijp wil je een tijd omzetten naar de goede notatie voor in de DB.

dit kan idd door gebruik te maken van date() icm. strtotime. Er is echter een probleem, strtotime verwacht een datun in de amerikaanse notatie, vandaar dat het voorbeeld van deploy niet werkt:

code:
1
2
3
4
<?
$date = "7-2-2004 0:00:00"; //europese notatie
print date("Y-m-d H:m", strtotime($date));
?>


Het enige dat je dan naar mijn idee hoeft te doen is 7-2-2004 om te draaien, want het volgende werkt prima:

code:
1
2
3
4
<?
$date = "2004-2-7 0:00:00"; //amerikaanse notatie
print date("Y-m-d H:m", strtotime($date));
?>


die nullenr ban 02 en 07 zet hij er dan automatisch bij.

Ik hoop dat je er wat aan hebt :>
De intentie is:

Ik heb een database met 300.000 personen erin. Veld birthday is varchar en ik moet hem omzetten naar date of timestamp.
Invoeren zijn nederlands dus: 7-2-2004 0:00:00 ipv 2004-02-07 0:00:00
Dit moet met de lichts mogelijke manier gedaan worden, omdat dit scriptje dus 300.000x achter elkaar uitgevoerd wordt.

Ik zie ook een mogelijkheid birthday op zon manier uit de database te halen dat het gezien wordt als een datum. Maar ik zou niet weten hoe. Hopelijk komt iemand met een voorbeeld, zodat ik niet al die 300.000 mensen hoe om te zetten...

Acties:
  • 0 Henk 'm!

Verwijderd

Sja, nu ik er over nadenk miste ik idd een beetje de essentie, want dat "even omdraaien" waren jullie mee bezig ;) :P

Het beste is dus idd om iets van split ofzo te gebruiken ;)

Dus de snelste manier is dus denk ik zoals ik zei, alleen is dat omdraaien wat minder gemakkelijk als ik insinueerde

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 05 januari 2005 @ 13:40:
Sja, nu ik er over nadenk miste ik idd een beetje de essentie, want dat "even omdraaien" waren jullie mee bezig ;) :P

Het beste is dus idd om iets van split ofzo te gebruiken ;)

Dus de snelste manier is dus denk ik zoals ik zei, alleen is dat omdraaien wat minder gemakkelijk als ik insinueerde
Ik gebruik nu dit, alleen is hij verschrikkelijk lang bezig en kost het 100% van mn CPU voor al die tijd:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql=mysql_query("SELECT birthday FROM person");
while($row=mysql_fetch_array($sql))
    {
    
    $dat=explode (" ", $row[birthday]); 
        $datr=explode ("-", $dat[0]);
                $dag = $datr[0]; 
                $maand = $datr[1]; 
                $jaar = $datr[2]; 
                if(strlen($dag)=="1"){$dag="0".$dag;}
                if(strlen($maand)=="1"){$maand="0".$maand;}

        $geb=$jaar.$maand.$dag;
        mysql_query("UPDATE person SET gebdat='$geb' WHERE personid='$row[personid]'");
    }


Maar ik heb liever dat ik niet hoef te gebruiken, dat ik gewoon rechtstreeks uit de database mensen kan opvragen op geboortedatum.

[ Voor 18% gewijzigd door Verwijderd op 05-01-2005 13:51 ]


Acties:
  • 0 Henk 'm!

  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 26-04-2024
PHP:
1
2
3
4
5
6
$input = "7-12-2004 0:00:00";

$input = explode(' ', $input);
$input = implode('-', array_reverse(explode('-', $input[0])));

echo date("Y-m-d", strtotime($input));
En dit dan :?

De laatste regel (met date()) kun je dus ook aanpassen en in je query zetten
code:
1
SET birthday = FROM_UNIXTIME($input)


Maar wat maakt het uit dat het lang duurt? Ik neem aan dat het iets eenmaligs is, dan maakt het toch niet veel uit dat hij er even over doet?

[ Voor 20% gewijzigd door ludo op 05-01-2005 13:57 ]


Acties:
  • 0 Henk 'm!

  • Viva Vince
  • Registratie: Oktober 2002
  • Laatst online: 07-11-2024
Onder de veronderstelling dat me MySQL gebruikt (maar andere DB's hebben vast een dergelijke functie).

Probeer de MySQL functie
STR_TO_DATE(str,format)
This is the reverse function of the DATE_FORMAT() function. It takes a string str and a format string format. STR_TO_DATE() returns a DATETIME value if the format string contains both date and time parts, or a DATE or TIME value if the string contains only date or time parts. The date, time, or datetime values contained in str should be given in the format indicated by format.

eens (zie ook http://dev.mysql.com/doc/...e_and_time_functions.html). Dan doet je DB het werk, zonder tussen komst van PHP (misschien insert select?)

In combinatie met IS NOT NULL kan je er zelfs kijken of het al in het goede formaat is/was en dus ook er in gooien

@ludo
Je hebt een punt dat het pas vanaf 4.1 is, maar we weten nog niks over de DB van de TS. Is het uberhaupt wel MySQL? Had het kunnen zien aan mysql_query 8)7

[ Voor 23% gewijzigd door Viva Vince op 05-01-2005 14:18 ]


Acties:
  • 0 Henk 'm!

  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 26-04-2024
Viva Vince schreef op woensdag 05 januari 2005 @ 14:00:
Onder de veronderstelling dat me MySQL gebruikt (maar andere DB's hebben vast een dergelijke functie).

Probeer de MySQL functie
STR_TO_DATE(str,format)
This is the reverse function of the DATE_FORMAT() function. It takes a string str and a format string format. STR_TO_DATE() returns a DATETIME value if the format string contains both date and time parts, or a DATE or TIME value if the string contains only date or time parts. The date, time, or datetime values contained in str should be given in the format indicated by format.

eens (zie ook http://dev.mysql.com/doc/...e_and_time_functions.html). Dan doet je DB het werk, zonder tussen komst van PHP (misschien insert select?)
Dat zou inderdaad de meest elegante oplossing zijn, maar:
STR_TO_DATE() is available as of MySQL 4.1.1
En ik denk niet dat TS gebruik maakt van mysql 4.1

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ludo schreef op woensdag 05 januari 2005 @ 13:55:
PHP:
1
2
3
4
5
6
$input = "7-12-2004 0:00:00";

$input = explode(' ', $input);
$input = implode('-', array_reverse(explode('-', $input[0])));

echo date("Y-m-d", strtotime($input));
En dit dan :?

De laatste regel (met date()) kun je dus ook aanpassen en in je query zetten
code:
1
SET birthday = FROM_UNIXTIME($input)


Maar wat maakt het uit dat het lang duurt? Ik neem aan dat het iets eenmaligs is, dan maakt het toch niet veel uit dat hij er even over doet?
Het script moet wekelijks uitgevoerd worden..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ludo schreef op woensdag 05 januari 2005 @ 14:04:
[...]
Dat zou inderdaad de meest elegante oplossing zijn, maar:

[...]
En ik denk niet dat TS gebruik maakt van mysql 4.1
Nee, 3. nogiets, kan even niet vinden welke versie het is. Jammer, ik probeer lodo's ding even..


Helaas:

Warning: date() [function.date]: Windows does not support dates prior to midnight (00:00:00), January 1, 1970 in E:\Webserver\httpdocs\test\uwtoekomst\test.php on line 21

[ Voor 24% gewijzigd door Verwijderd op 05-01-2005 14:21 ]


Acties:
  • 0 Henk 'm!

  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 26-04-2024
Wat gebeurt er als je die laatste regel gewoon weglaat, dus zoiets:

PHP:
1
2
3
4
5
6
7
8
9
$result = mysql_query("SELECT personid, birthday FROM person");

while($row = mysql_fetch_array($result))
{
    $input = explode(' ', $row['birthday']);
    $input = implode('-', array_reverse(explode('-', $input[0]))); 
    
    mysql_query("UPDATE person SET gebdat = '" . $input . "' WHERE personid = '" . $row['personid'] . "'");
}
Want bedenkt mysql zelf niet dat er nog nullen voor die datum moeten?

Quote uit de mysql manual:
For values specified as strings that include date part delimiters, it is not necessary to specify two digits for month or day values that are less than 10. '1979-6-9' is the same as '1979-06-09'.

[ Voor 40% gewijzigd door ludo op 05-01-2005 15:01 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Even iets anders... is het niet makkelijker om te zorgen dat je bij het maken van de CSV file zorgt dat ACCES het juiste formaat uitspuugt??

Als dat niet mogelijk is kun je altijd nog zelf de CSV file parsen en in je database schrijven. Een oplossing waarbij je eerst data in een database zet en vervolgens gelijk die data moet gaan updaten komt op mij nogal inefficiënt over namelijk.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ludo schreef op woensdag 05 januari 2005 @ 14:58:
Wat gebeurt er als je die laatste regel gewoon weglaat, dus zoiets:

PHP:
1
2
3
4
5
6
7
8
9
$result = mysql_query("SELECT personid, birthday FROM person");

while($row = mysql_fetch_array($result))
{
    $input = explode(' ', $row['birthday']);
    $input = implode('-', array_reverse(explode('-', $input[0]))); 
    
    mysql_query("UPDATE person SET gebdat = '" . $input . "' WHERE personid = '" . $row['personid'] . "'");
}
Want bedenkt mysql zelf niet dat er nog nullen voor die datum moeten?

Quote uit de mysql manual:

[...]
Hmmm, dit gaat wel aardig. Maar hij is nu ongeveer 2 sec! per persoon bezig.. Dat is 2x300.000 =600.000 sec = 10000 min = te lang bezig

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
T-MOB schreef op woensdag 05 januari 2005 @ 15:01:
Even iets anders... is het niet makkelijker om te zorgen dat je bij het maken van de CSV file zorgt dat ACCES het juiste formaat uitspuugt??

Als dat niet mogelijk is kun je altijd nog zelf de CSV file parsen en in je database schrijven. Een oplossing waarbij je eerst data in een database zet en vervolgens gelijk die data moet gaan updaten komt op mij nogal inefficiënt over namelijk.
ja, dat is het beste ja.. Ik heb geen idee hoe access werkt, weet alleen hoe je kunt opslaan als csv en hoe je velden wist enz. Ik kijk even op google.

En die csv parsen, hoe doe je dat? het moet wel op die manier inderdaad

Acties:
  • 0 Henk 'm!

  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 19-09 19:14
misschien is de capiteit van de webserver niet toereikend...

overigens, als het steeds dezelfde data is, maar alleen elke keer nieuwe gegevens erbij, zou je dan niet een check kunnen maken dat als de oude gegevens er nog in staan ze niet verwijderd worden, en dat je alleen nog maar nieuwe gegevens update of insert.

/dev/null


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
vriesdude schreef op woensdag 05 januari 2005 @ 15:08:
misschien is de capiteit van de webserver niet toereikend...

overigens, als het steeds dezelfde data is, maar alleen elke keer nieuwe gegevens erbij, zou je dan niet een check kunnen maken dat als de oude gegevens er nog in staan ze niet verwijderd worden, en dat je alleen nog maar nieuwe gegevens update of insert.
Het staat nu op een testservertje (p3 1100mhz 384MB) en gaat over op een "echte" server als het af is (p4 2,8 1GB). Maar als zou de server 2x zo snel zijn, dan nog is hij te lang bezig. Ik moet doen wat T-MOB zei. Alleen nu uitzoeken HOE.

Aha: Access help:

De datumnotatie die in Access wordt gebruikt, wordt bepaald door de landinstellingen van het systeem. Als u bijvoorbeeld datums wilt weergeven met de Thaise datumnotatie, moet Thais zijn geselecteerd bij de landinstellingen van het Configuratiescherm van Windows. U kunt in dezelfde database datumwaarden zowel in de Gregoriaanse kalender als in de Boeddhistische kalender invoeren door de juiste kalender op te geven.


Hehe, goed zo, hopen dat het nu wel werkt

[ Voor 28% gewijzigd door Verwijderd op 05-01-2005 15:18 ]


Acties:
  • 0 Henk 'm!

  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 19-09 19:14
[quote]Verwijderd schreef op woensdag 05 januari 2005 @ 15:13:
[...]


Het staat nu op een testservertje (p3 1100mhz 384MB) en gaat over op een "echte" server als het af is (p4 2,8 1GB). Maar als zou de server 2x zo snel zijn, dan nog is hij te lang bezig. Ik moet doen wat T-MOB zei. Alleen nu uitzoeken HOE.

Het hangt niet alleen af van megahertzen, ook geheugentoegangssnelheid (FSB), hard disk snelheid (IDE tegen SCSI RAID 5) en hoeveelheid geheugen.

Misschien draait het geheel wel veels neller dan de verdubbeling die je verwacht.

/dev/null


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 05 januari 2005 @ 15:13:
[...]


Het staat nu op een testservertje (p3 1100mhz 384MB) en gaat over op een "echte" server als het af is (p4 2,8 1GB). Maar als zou de server 2x zo snel zijn, dan nog is hij te lang bezig. Ik moet doen wat T-MOB zei. Alleen nu uitzoeken HOE.

Aha: Access help:

De datumnotatie die in Access wordt gebruikt, wordt bepaald door de landinstellingen van het systeem. Als u bijvoorbeeld datums wilt weergeven met de Thaise datumnotatie, moet Thais zijn geselecteerd bij de landinstellingen van het Configuratiescherm van Windows. U kunt in dezelfde database datumwaarden zowel in de Gregoriaanse kalender als in de Boeddhistische kalender invoeren door de juiste kalender op te geven.


Hehe, goed zo, hopen dat het nu wel werkt
Okey, heel fijn, het werkt :/
Tsja, dat gaat een stuk sneller dan de hele database overhoop te laten gooien :-)

Nou heel erg bedankt iedereen voor de moeite, ik blij dat het nu zo werkt als ik het wilde

:)

Acties:
  • 0 Henk 'm!

Verwijderd

Zo ben je toch weer een dag verder ;) heerlijk :P

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Ik heb met een vergelijkbaar probleem te maken gehad. Access genereerde gegevens voor een php-applicatie, die het via XML-RPC verstuurde. Access maakt altijd gebruik van de systeeminstellingen, zodat het per klant een ander formaat was.
ging ongeveer als volgt:
PHP:
1
2
3
4
5
6
7
8
9
10
$spaces = explode(" ", $datestring);
$time = explode(":", $spaces[1]);
if (count($spaces) >2)
{
  if ($spaces[3] == "PM") $time[0] += 12;
}
if //$spaces[0] heeft /
//explode "/", en bouw string op met bron MM/DD/YY en doel YY-DD-MM
else
//explode"-", en bouw string op met bron DD-MM-YY

Dit ging best snel. Zorgde nauwelijks voor wachttijd bij 100 waarden. Dus hoe het dan komt dat het bij jouw minuten duurt snap ik echt niet...

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
MBV schreef op woensdag 05 januari 2005 @ 16:13:
Dit ging best snel. Zorgde nauwelijks voor wachttijd bij 100 waarden. Dus hoe het dan komt dat het bij jouw minuten duurt snap ik echt niet...
Ik denk dat het verschil zit in het uitvoeren van queries. Jouw stukje code zal idd zelfs met 300.000 waarden nog niet heel veel tijd kosten. Het uitvoeren van 300.000 update-queries daarentegen :X (dat is met 1000 queries per seconde nog 5 minuten, en daar heb je dan een knap rappe server voor nodig).

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Waarom los je het niet gewoon binnen mysql op? dat gaat volgens mij 100x sneller dan nog eens met een scripttaal er tussen gaan zitten klooien

MySQL:
1
2
3
4
5
UPDATE person SET gebdat=CONCAT(
    SUBSTRING(birthday, 7, 4), '-',
    SUBSTRING(birthday, 4, 2), '-',
    SUBSTRING(birthday, 1, 2)
    );


p.s. en er gewoon een DATE veld van maken trouwens (of wil je ook bijhouden op welk tijdstip ze geboren zijn??

// edit ik zie nu dat ze niet altijd als dd-mm worden ingevoerd,
maar ook dat valt nog wel op te lossen door een beetje creatief met LOCATE, LENGTH en SUBSTRING te zijn

[ Voor 36% gewijzigd door marty op 05-01-2005 19:29 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
marty schreef op woensdag 05 januari 2005 @ 19:23:
Waarom los je het niet gewoon binnen mysql op? dat gaat volgens mij 100x sneller dan nog eens met een scripttaal er tussen gaan zitten klooien

MySQL:
1
2
3
4
5
UPDATE person SET gebdat=CONCAT(
    SUBSTRING(birthday, 7, 4), '-',
    SUBSTRING(birthday, 4, 2), '-',
    SUBSTRING(birthday, 1, 2)
    );


p.s. en er gewoon een DATE veld van maken trouwens (of wil je ook bijhouden op welk tijdstip ze geboren zijn??

// edit ik zie nu dat ze niet altijd als dd-mm worden ingevoerd,
maar ook dat valt nog wel op te lossen door een beetje creatief met LOCATE, LENGTH en SUBSTRING te zijn
Thanx voor je reactie, dit was misschien ook een optie geweest inderdaad. Maar is dat wel mooi snel dan?

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
dat is - in vergelijk tot een oplossing met tussenkomst van een scripttaal - retesnel :-)
denk niet dat je je daar zorgen over hoeft te maken hoor

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
marty schreef op woensdag 05 januari 2005 @ 19:37:
dat is - in vergelijk tot een oplossing met tussenkomst van een scripttaal - retesnel :-)
denk niet dat je je daar zorgen over hoeft te maken hoor
Ow, bedoelt via een shell.... Niet mogelijk om dat te doen, omdat je niet kunt inloggen op de remote server via de shell. De database is ook alleen maar benaderbaar als "localhost" en kan dus ook niet op afstand bijgehouden worden.

Dit stukje kan dus niet in php verwerkt worden? Of wel via een while loopje?
Dan zou het nog steeds langzaam zijn zeker.....

:)

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
je kunt de code ook gewoon via een php-script doen. Het is maar 1 query, dus die voert mysql toch wel uit. (als ik me niet vergis).
desnoods zet je de timeout gewoon op oneindig.

heb trouwens even voor je zitten knutselen, en volgens mij moet dit werken:
MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT birthday, CONCAT(
  SUBSTRING(birthday,
        (LENGTH(birthday)-3),
        4
    ),
    '-',
  SUBSTRING(birthday,
        (LOCATE('-', birthday)+1),
        2
    ),
    '-',
  SUBSTRING(birthday,
        1,
        (LOCATE('-', birthday)-1)
    )
  ) AS geboortedatum
FROM person LIMIT 0, 10;


kun je die eerst doen om te kijken of je het gewenste formaat er uit krijgt. en als dat werkt kun je 'm in een update gebruiken


//edit
de update query wordt dan:
MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UPDATE person SET gebdat=CONCAT(
    SUBSTRING(birthday,
        (LENGTH(birthday)-3),
        4
    ),
    '-',
    SUBSTRING(birthday,
        (LOCATE('-', birthday)+1),
        2
    ),
    '-',
    SUBSTRING(birthday,
        1,
        (LOCATE('-', birthday)-1)
    )
  )

[ Voor 61% gewijzigd door marty op 05-01-2005 19:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
marty schreef op woensdag 05 januari 2005 @ 19:42:
je kunt de code ook gewoon via een php-script doen. Het is maar 1 query, dus die voert mysql toch wel uit. (als ik me niet vergis).
desnoods zet je de timeout gewoon op oneindig.

heb trouwens even voor je zitten knutselen, en volgens mij moet dit werken:
MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT birthday, CONCAT(
  SUBSTRING(birthday,
        (LENGTH(birthday)-3),
        4
    ),
    '-',
  SUBSTRING(birthday,
        (LOCATE('-', birthday)+1),
        2
    ),
    '-',
  SUBSTRING(birthday,
        1,
        (LOCATE('-', birthday)-1)
    )
  ) AS geboortedatum
FROM person LIMIT 0, 10;


kun je die eerst doen om te kijken of je het gewenste formaat er uit krijgt. en als dat werkt kun je 'm in een update gebruiken
Jeetje, echt heel erg bedankt! Misschien dat ik dit in de toekomst nog eens ga gebruiken.

Timeout zet ik met ini_set(max_execution_time,"99999"); altijd wat hoger (kan de php.ini niet aanraken), werkt ook prima :-)

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Ik zat me nog te bedenken dat je birthday een tijd er achter heeft staan en die LENGTH(birthday) dus niet gaat werken. ipv daarvan zou je een LOCATE op de spatie moeten doen.
Timeout zet ik met ini_set(max_execution_time,"99999"); altijd wat hoger (kan de php.ini niet aanraken), werkt ook prima :-)
PHP:
1
set_time_limit(0);

is voor oneindig ;)

[ Voor 8% gewijzigd door marty op 05-01-2005 23:09 ]

Pagina: 1