Avatar billede druen Nybegynder
25. januar 2007 - 09:12 Der er 30 kommentarer

Format af og sortering ef ter dato

Hej

Jeg har en mysql-database med en masse artikler, der har dato på følgende format (og det er fuldstændig konsekvent):

22. januar 2002

Nogen der kan hjælpe mig med at lave et php sciprt som formaterer denne string til en string, som artiklerne i databasen kan sorteres efter? (eller bare vise mig metoden hertil)
Avatar billede windcape Praktikant
25. januar 2007 - 09:26 #1
Det klogeste du kan gøre er at lave dine dato'er om til DATE/DATETIME eller UNIX_TIMESTAMP for at så kunne bruge ORDER.

At først parse det, og så sortere det med PHP er en kæmpe omvej, og hul i hovedet.
Avatar billede druen Nybegynder
25. januar 2007 - 09:27 #2
ok - hvordan laver jeg det om til UNIX_TIMESTAMP?
Avatar billede showsource Seniormester
25. januar 2007 - 09:27 #3
Som windscape skriver, opret et felt i din DB, som er af typen date.
Hent dine datoer, omformater dem til YY-mm-dd, så er det meget nemmere at arbejde med
Avatar billede showsource Seniormester
25. januar 2007 - 09:30 #4
UNIX_TIMESTAMP kan også bruges, men er selv til date/datetime.

tid i sek.

$nytid = mktime(0,0,0,måned, dag, år);
tre første nuller er time-minut-sekund
Avatar billede windcape Praktikant
25. januar 2007 - 09:31 #5
showsource besværlig måde :-)

kig http://dk2.php.net/manual/en/function.strtotime.php
Avatar billede windcape Praktikant
25. januar 2007 - 09:33 #6
pointen i post nr. 1 var at at bruge strtotime kræver at ens fetchede data først gemmes, og derefter sorteres, og derfor spilder tid og serverkraft.
Avatar billede showsource Seniormester
25. januar 2007 - 09:33 #7
Hans tid er jo i dansk, ( januar ) , så uanset hvordan skal den jo lige bearbejdes for at få et format mysql kan bruge til noget.
Avatar billede windcape Praktikant
25. januar 2007 - 09:35 #8
jo, men spørgsmålet siger jo at hans dato'er er gemt i det format han skrev, dvs. som en varchar vil jeg tro.
Avatar billede windcape Praktikant
25. januar 2007 - 09:36 #9
ville nok skrive et little batch job ( i php :p) til at håntere konverteringen, afhænger af hvor mange artikler der er i tallen.
Avatar billede showsource Seniormester
25. januar 2007 - 09:36 #10
Tror vi snakker forbi hinanden. ?
Avatar billede showsource Seniormester
25. januar 2007 - 09:36 #11
Nåh, enige om at ændre i DB er vi! :O)
Avatar billede windcape Praktikant
25. januar 2007 - 09:38 #12
ville stadigvæk bruge strtotime() ellers skal der skrives en parser først :p
Avatar billede druen Nybegynder
25. januar 2007 - 09:53 #13
tak for alle svarene

Problemet nu er bare, at der er +500 artikler (= jeg kan ikke ændre formatet i hånden), og jeg kan jo ikke rigtig bruge strtotime(), så vidt jeg kan se, da den fungerer med engelske datoer....
Avatar billede windcape Praktikant
25. januar 2007 - 09:55 #14
skriv et batch job som producere et SQL dump med rettelserne, og så lav din struktur om, og kør det.
Avatar billede windcape Praktikant
25. januar 2007 - 09:57 #15
lidt at gå i gang med:

<?php
$date = '22. januar 2002';
$splitted = preg_match("|([0-9]{2}\. (.*?)`([0-9]{4})|",$date);
?>

så er det bare at læse op :-)
Avatar billede druen Nybegynder
25. januar 2007 - 09:57 #16
batch job?
Avatar billede windcape Praktikant
25. januar 2007 - 09:57 #17
*typo

preg_match("|([0-9]{2}\. (.*?) ([0-9]{4})|",$date);
Avatar billede windcape Praktikant
25. januar 2007 - 09:58 #18
druen ja, et php script som bare lige laver din nye SQL for dig. og ikke så meget andet.
Avatar billede druen Nybegynder
25. januar 2007 - 10:17 #19
Hej, ja har nu lavet følgende script, og ville lige høre om det kommer med det helt rigitge output.
Dette skal så bare sættes ind i mysql'en i en kolonne af formen DATETIME eller hvorn?

$date = '22. januar 2002';

$day = explode(".", $date);
$day = $day[0];
$month = explode(" ", $date);
$month = $day[1];
if($month == "januar"){$month = 1;}
if($month == "februar"){$month = 2;}
if($month == "marts"){$month = 3;}
if($month == "april"){$month = 4;}
if($month == "maj"){$month = 5;}
if($month == "juni"){$month = 6;}
if($month == "juli"){$month = 7;}
if($month == "august"){$month = 8;}
if($month == "september"){$month = 9;}
if($month == "oktober"){$month = 10;}
if($month == "november"){$month = 11;}
if($month == "december"){$month = 12;}
$year = explode(" ", $date);
$year = $year[2];

$time = mktime(0,0,0,$month,$day,$year);

echo "$time"; // Output = 1014332400
Avatar billede windcape Praktikant
25. januar 2007 - 10:19 #20
$months = array('januar'=>1,'februar'=>2,....)

ville nok være en del smartere, fordi så kunne du bare bruge

$time = mktime(0,0,0,$months[$month],$day,$year); (med din nuværende kode, jeg synes stadig du skal bruge en preg_match)
Avatar billede showsource Seniormester
25. januar 2007 - 10:24 #21
Hvorfor nu preg_match?
( dit ex. fejler iøvrigt hos mig? )

Anyway, et "helt" script:

<?php

// connect til DB

$tabel = "tabelnavn";
$oldtime = "gammeltid";
$newtime = "nytid"; // af typen date
$ref = "id"; // en kollone som er unik, bruges ved UPDATE

$maaneder = Array(1 => "januar", 2 => "februar", 3 => "marts", 3 => "april", 3 => "maj", 3 => "juni", 3 => "juli", 3 => "august", 3 => "september", 3 => "oktober", 3 => "november", 3 => "december");

$sql = mysql_query("SELECT `". $oldtime ."`, `". $ref ."` FROM `". $tabel ."`") or die (mysql_error());

while($new = mysql_fetch_object($sql)) {


$tid = str_replace(".", "", trim(strtolower($new->tid)));
echo $tid;

$values = explode(" ", $tid);
$save = $values[2] ."-". array_search($values[1], $maaneder) ."-". $values[0];

$update = "UPDATE `". $tabel ."` SET `". $newtime ."` = '". $save ."' WHERE `". $ref ."` = ". $new->$ref;

echo "<br />". $update;

//mysql_query($update) or die (mysql_error());

echo"<p>";

?>
Avatar billede showsource Seniormester
25. januar 2007 - 10:25 #22
Hov for satan da! :O) (copy/paste)

$maaneder skal jo lige ha' de rette numre!
Avatar billede windcape Praktikant
25. januar 2007 - 10:26 #23
fordi at en regulare expression er smartere, og giver et mere direkte resultat, brugt sammen med f.eks. list() kunne man lave noget meget mere læsbar kode.
Avatar billede windcape Praktikant
25. januar 2007 - 10:27 #24
derudover har du lavet en stor fejl showsource.

Han skal have produceret en SQL string, som printes, han først manual kører EFTER at have lavet strukturen om.

At lave update direkte vil måske fejle, og ødelægge data værdierne når dato feltet ændres til integer.
Avatar billede showsource Seniormester
25. januar 2007 - 10:32 #25
Well, hvilken fejl er der her, mener du ( efter "reformatering" ) :O)

<?php
// connect til DB

$tabel = "tabelnavn";
$oldtime = "gammeltid";
$newtime = "nytid"; // af typen date
$ref = "id"; // en kollone som er unik, bruges ved UPDATE

$maaneder = Array(1 => "januar", 2 => "februar", 3 => "marts", 4 => "april", 5 => "maj", 6 => "juni", 7 => "juli", 8 => "august", 9 => "september", 10 => "oktober", 11 => "november", 12 => "december");

$sql = mysql_query("SELECT `". $oldtime ."`, `". $ref ."` FROM `". $tabel ."`") or die (mysql_error());

while($new = mysql_fetch_object($sql)) {


$tid = str_replace(".", "", trim(strtolower($new->$oldtime)));
echo $tid;

$values = explode(" ", $tid);
$save = $values[2] ."-". array_search($values[1], $maaneder) ."-". $values[0];

$update = "UPDATE `". $tabel ."` SET `". $newtime ."` = '". $save ."' WHERE `". $ref ."` = ". $new->$ref;

echo "<br />". $update;

//mysql_query($update) or die (mysql_error());

echo"<p>";

?>

Det gamle felt bibeholdes jo stadig.

Og preg_match suger nu trods alt mere saft end end "godt gammeldags" array
Avatar billede windcape Praktikant
25. januar 2007 - 10:34 #26
Avatar billede windcape Praktikant
25. januar 2007 - 10:35 #27
og den suger mindre kraft end jeres dobbelt explode,trim og str_replace :p
Avatar billede windcape Praktikant
25. januar 2007 - 10:35 #28
rettelse:

<?php

$months = array('januar','februar','marts','april','maj','juni','juli'
              ,'august','september','oktober','november','december');

$dato = "21. Januar 2006";
preg_match("|([0-9]{2})\. ([a-zA-Z]+) ([0-9]{4})|",$dato,$result);
list(,$day,$month,$year) = $result;

$time = mktime(0,0,0,array_search(strtolower($month),$months),$day,$year);

echo $time;

?>
Avatar billede windcape Praktikant
25. januar 2007 - 10:37 #29
rettelse 2:
<?php

$months = array('januar','februar','marts','april','maj','juni','juli'
              ,'august','september','oktober','november','december');

$dato = "21. Januar 2006";
preg_match("|([0-9]{2})\. ([a-zA-Z]+) ([0-9]{4})|",$dato,$result);
list(,$day,$month,$year) = $result;

$time = mktime(0,0,0,array_search(strtolower($month)+1,$months),$day,$year);

echo $time;

?>

glemte at tage hensyn til at arrays starter ved 0, og måneder ved 1
Avatar billede windcape Praktikant
25. januar 2007 - 10:37 #30
rettelse 3:

$time = mktime(0,0,0,array_search(strtolower($month),$months)+1,$day,$year);

som jeg dog fejler at taste fra denne her maskine (gid det trådløse ville virke, så dev-maskinen kom online).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester