02. november 2010 - 20:19Der er
13 kommentarer og 1 løsning
Sortering efter dato
Jeg skal have hentet nogle indlæg efterdato. Så de nyeste kommer først. Har opdelt min dato. Så jeg har en kolonne til dag, en til måned og en til år. Jeg har lavet et forsøg her:
mysql_query("select * from kamp_ref where status ='godkendt' AND hold_id ='$id' order by dato_aar, dato_maaned, dato_dag DESC") or die(mysql_error());
Det giver datoerne: 31/10-2010 3/10-2010 15/10-2010 26/9-2010
Kan godt se problemet er når den sorterer kigger den kun på første tal. Hvordan kommer jeg lige uden om det. Så den opfatter 3 som mindre end 15?
Du skal anvende dato-typen til feltet i databasen. Det kan se sådan ud "2010-11-02". Så sorterer den korrekt, og du kan så vende din dato om ved INSERT i databasen, og ved udtræk, hvis den skal vises anderledes for dine brugere.
Jamen det maa skyldes at datoen sidder i tabellen som en tekststreng, ikke som et tal. Datatypen for dato_dag maa vaere CHAR eller VARCHAR. Du spoerger saa hvordan du 'lige' kommer uden om det. Svar: ved 'lige' at korrigere din datastruktur.
Lad os antage at tabellen kamp_ref har disse kolonner og datatyper:
id INT, status VARCHAR(10), dato_aar VARCHAR(10), dato_maaned VARCHAR(10), dato_dag VARCHAR(10).
Saa kan du korrigere datatyperne ved at oprette en ny tabel med den korrekte data-struktur. Som minimum maa du soerge for at aar, maaned, og dag opbevares som tal og ikke som tekststrenge. Lav en ny tabel med de rigtige datatyper og kopier indholdet fra den gamle tabel over til den nye tabel. For eksempel:
Hvis du goer dette, naturligvis korrigeret til at reflektere din aktuelle kamp_ref tabel, saa vil du faa dato_dag sorteret saadan som man sorterer tal, det vil sige, for eksempel, at 15 er stoerre end 3.
Jeg sagde at det er var minimum loesningen. Den endelige loesning er naturligvis at du ikke deler datoen op i tre kolonner men at du laver en kolonne dato med datatype DATE. Saa faar du dine datoer sorteret korrekt.
erikjacobsen, der var du lige, endnu en gang, hurtigere end jeg. Og endnu en gang siger vi, i realiteten, det samme. Som de siger paa engelsk: "great minds think alike!"
Hej Jeg tror at du skal bar skrive ["ORDER BY DATESUBMITTED DESC"] . Hvis din server er en dask server så får du dato som dd/mm/yyyy du kan ordne dato på den måde .
<% Function DanskDatoTid(dato)
' Array med danske navne på dage arrDag = ",mandag,tirsdag,onsdag,torsdag,fredag,lørdag,søndag" arrDag = Split(arrDag,",")
' Array med danske navne på måneder arrMaaned = ",januar,februar,marts,april,maj,juni,juli,august," arrMaaned = arrMaaned & "september,oktober,november,december" arrMaaned = Split(arrMaaned,",")
' Datoen sammensættes DanskDatoTid = arrDag(Weekday(dato,VbMonday)) & " d. " & Day(dato) & ". " DanskDatoTid = DanskDatoTid & arrMaaned(Month(dato)) & " " & Year(dato) 'Jeg tror ikke , at du vil bruge klokken men ellers kan 'du bruge det her også . DanskDatoTid = DanskDatoTid & " kl. " & FormatDateTime(dato, vbShortTime)
End Function
Response.Write DanskDatoTid(Now) %> Jeg håber , det kunne hjælpe .
Ok, nu har jeg læst hvad der faktisk skrives i spørgsmålet. Hvis alle de tre felter er heltal, så skal du skrive DESC tre gange, ikke bare een:
mysql_query("select * from kamp_ref where status ='godkendt' AND hold_id ='$id' order by dato_aar DESC, dato_maaned DESC, dato_dag DESC") or die(mysql_error());
...men stadigvæk. Et DATO-felt er ret fornuftigt at bruge til en dato.
Men med resultatet at 3 er stoerre end 15 saa kan felterne ikke vaere heltal, de maa vaere tekststrenge. Eller er det mig der har drukket for mange oeller i aften?
Kan se det ikke er den fornuftige måde jeg har fået opbygget min database på. Så det er vist det der kaldes en ommer.
erikjacobsen /> mysql_query("select * from kamp_ref where status ='godkendt' AND hold_id ='$id' order by dato_aar DESC, dato_maaned DESC, dato_dag DESC") or die(mysql_error());
Resulterer i samme output.
Christian_Belgien /> smid et svar.
Er der en af jer der kan smide mig et link til hvor jeg kan gøre mig lidt klogere på at opstille min database korrekt med "DATE" felt?
coder_carl: Du kan reparere det rimeligt fornuftigt ved at lave de tre felter om til INT-typen. Det bør kunne ske uden datatab, fx i PHPMyAdmin (men tag en backup først). Dernæst kan du overveje hvornår du skal gøre andet.
erikjacobsen /> Jeg vil hellere have en "rigtig"-løsning fremfor at en halv. Scriptet er som sådan ikke taget i brug endnu. Var ikke klar over der var nogen der allerede havde tænkt tanken med dato i MySQL. Troede kun det var noget folk gjorde fordi de var dovne. Sytne jeg var genial da jeg tænkte tanken med at dele det op, da det så ville lette arbejdet med at hente data ud i rigtig orden. Hvilket så har haft lige præcis modsat effekt.
Tidliger var min tabel: CREATE TABLE `kamp_ref` ( ... `dato_dag` varchar(10) NOT NULL default '', `dato_maaned` varchar(10) NOT NULL default '', `dato_aar` varchar(10) NOT NULL default '', ... `id` int(11) NOT NULL auto_increment, PRIMARY KEY (`id`) );
Skal
`dato_dag` varchar(10) NOT NULL default '', `dato_maaned` varchar(10) NOT NULL default '', `dato_aar` varchar(10) NOT NULL default '',
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.