03. marts 2005 - 15:41Der er
8 kommentarer og 1 løsning
Kan man tvinges mysql til at sortere med en bestemt dato syntax?
Hej Eksperter
Jeg har en tabel der indeholder en liste med en række datoer i formatet: dd.mm.yyyy. Dog er der nogle steder hvor der er undtagelser og der står en lille tekst i stedet for en dato. Derfor har jeg sat den pågældende kolonne til at være en varchar. Dette gør desværre, at jeg ikke kan sortere efter datoerne. Hvis jeg sortere på dato-kolonnen bliver det jo således, da den tror det er et "tekstfelt" (varchar): 01.02.1954 03.01.2004 03.06.1998 10.03.1999 21.02.1986
osv... Det er jo ikke logisk? Kan man ikke "tvinge" MySQL til at sortere som om det var en timestamp-felttype-kolonne? (og helst i formatet dd.mm.yyyy)
Det skal siges, at jeg ikke kan lave feltet om til en "DateTime", da det jo nogle gange skal indeholde tekst.
Du kan ikke få mysql til at sortere en tekst streng som om det var en dato. Du kan naturligvis sortere i php, asp, c eller hvad dit programmeringssprog nu er. Men ligemeget hvad du gør bliver det en "dyr" løsning (målt i udførselstid).
Hvad er årsagen til at du ikke kan lave kolonnen til datetime?
Den absolut bedste løsning ville være at du lavede kolonnen til en datetime. Så må du før indsættelse konvertere teksstrengen til en datetime.
Hvis du nogle gange vil skrive en tilfældig tekst, kan du så ikke oprette en helt ny kolonne til den tekst? Du kan jo aldrig komme til at sortere korrekt hvis der står
Okay! :( Jeg kan ikke lave det om til en DateTime fordi der nogle gange simpelthen ikke er en dato i feltet. Kolonnen afspejler "Keywords"-feltet i en lang række pdf-filer. Nogle af mine kunder bruger keyword-feltet til datoer, andre til nøgleord osv. Så derfor ...
Nogen gode idéer (den eneste løsning indtil videre er vel at sortere det i mit php)?
Den bedste løsning er som sagt at have to kolonner i db. En i dato format og en i tekst format (varchar).
Du skal så i php sørge for at indsætte i den korrekte kolonne. Hvis du modtager tekst indsætter du i tekstfeltet og undlader at indsætte i dato feltet.
Men du kommer ikke udenom at sortere i php. Enten før du indsætter (som er at foretrække) eller efter du har trukket data ud af databasen.
... ORDER BY IF(SUBSTRING(feltnavn,3,1)='.' AND SUBSTRING(feltnavn,6,1)='.', CONCAT(SUBSTRING(feltnavn,7,4),SUBSTRING(feltnavn,4,2),SUBSTRING(feltnavn,1,2)), 'Not a date')
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.