Avatar billede Asger Carlsen Nybegynder
02. november 2010 - 20:19 Der 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?
Avatar billede erikjacobsen Ekspert
02. november 2010 - 22:10 #1
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.
02. november 2010 - 22:17 #2
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:

CREATE TABLE kamp_ref_a(id INT, status VARCHAR(10), dato_aar INT, dato_maaned INT, dato_dag INT);

INSERT INTO kamp_ref_a SELECT * FROM kamp_ref

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.
02. november 2010 - 22:20 #3
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!"
Avatar billede MNS Nybegynder
02. november 2010 - 22:26 #4
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 .
Avatar billede erikjacobsen Ekspert
02. november 2010 - 22:30 #5
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.
02. november 2010 - 22:49 #6
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?
Avatar billede Asger Carlsen Nybegynder
02. november 2010 - 22:53 #7
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?
Avatar billede erikjacobsen Ekspert
02. november 2010 - 22:53 #8
Man kan vel ikke få for meget belgisk øl.

Jo, der må være to ting galt: tekst-felter, og manglende DESC-er.

Og med mindre der er en god grund til at opdele i 3 felter, så forslaget om DATE-felttypen - der er ingen grund til at genopfinde det hårdkogte æg ;)
Avatar billede erikjacobsen Ekspert
02. november 2010 - 22:55 #9
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.
03. november 2010 - 05:52 #10
Svar fra mig/
03. november 2010 - 05:59 #11
Jeg har altid haft glaede af W3schools som tutorial. For eksempel om DATE som datatype skriver de dette: http://www.w3schools.com/sql/sql_datatypes.asp
Avatar billede Asger Carlsen Nybegynder
03. november 2010 - 08:40 #12
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 '',

Så erstattes af en enkel

  `dato` DATE() NOT NULL default '',
?
Avatar billede erikjacobsen Ekspert
03. november 2010 - 15:23 #13
Avatar billede Asger Carlsen Nybegynder
03. november 2010 - 19:43 #14
Okay, det prøver jeg at gå videre med.

Jeg sige rmange tak til jer begge :)
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
Computerworld tilbyder specialiserede kurser i database-management

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