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)
Annonceindlæg fra Infor
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.
25. januar 2007 - 09:27
#2
ok - hvordan laver jeg det om til UNIX_TIMESTAMP?
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
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
25. januar 2007 - 09:31
#5
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.
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.
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.
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.
25. januar 2007 - 09:36
#10
Tror vi snakker forbi hinanden. ?
25. januar 2007 - 09:36
#11
Nåh, enige om at ændre i DB er vi! :O)
25. januar 2007 - 09:38
#12
ville stadigvæk bruge strtotime() ellers skal der skrives en parser først :p
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....
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.
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 :-)
25. januar 2007 - 09:57
#16
batch job?
25. januar 2007 - 09:57
#17
*typo preg_match("|([0-9]{2}\. (.*?) ([0-9]{4})|",$date);
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.
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
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)
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>"; ?>
25. januar 2007 - 10:25
#22
Hov for satan da! :O) (copy/paste) $maaneder skal jo lige ha' de rette numre!
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.
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.
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
25. januar 2007 - 10:34
#26
25. januar 2007 - 10:35
#27
og den suger mindre kraft end jeres dobbelt explode,trim og str_replace :p
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; ?>
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
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).
Vi tilbyder markedets bedste kurser inden for webudvikling