2009-08-21 7 views
0

Hey Leute - Das Problem rührt von einer schlecht entworfenen Datenbank her, die benutzt wird, um Immobilieninformationen zu speichern. Ich habe eine Vorlage für meinen Kunden erstellt, um ein Wochenende auszuwählen und die offenen Häuser für dieses Wochenende anzuzeigen. Offene Hauszeiten (ohtime1, ohtime2, ohtime3) werden als winziger Text gespeichert, ohne dass man AM oder PM kennt. "12:00 - 2:00" und "01:00 - 03:00" sind häufige Einträge, die wir Menschen als Mittag-2pm und 1 pm-3pm unterscheiden, aber wenn ich die Datenbank abfrage und ORDER BY ohtime1, setzt sie offensichtlich 01 : 00 vor 12:00 Uhr. Ich habe Schwierigkeiten beim Sortieren mit SQL und mit den verschiedenen PHP-Sortiermethoden. Die Erstnotierungen Array mit allen offenen Tür Informationen wie etwas wie folgt festgelegt:Sortiere tinytext time von mysql db query mit sql oder sortiere das erzeugte Array mit PHP

$ Listings [0] [displayaddress] = Empire State Building
$ Listings [0] [Bäder] = zu viele
zählen $ Listings [0] [ohtime1] = 12.00 bis 02.00 Uhr

$ Listings [1] [displayaddress] = Madison square garden
$ Listings [1] [Bäder] = 2
$ Listings [ 1] [ohtime1] = 01:00 - 03:00
etc ...

Ich durchläuft $ Listings mit foreach ($ Listings als $ Listing) für die Smarty-Vorlagen zu verarbeiten, die wir verwenden, sowie in die verschiedenen Tage zu trennen, und dann wieder für Manhattan und Brooklyn-Listen. Dies führt zu 4 neuen Arrays. Meine Theorie war, wenn ich alle Zeiten vor 09:00 Uhr in 24-Stunden-Zeit umwandle, dann sortiere ich sie und weise sie dann dem anderen Tag/Ort zu, wo sie funktionieren würde. Hier ist die Umwandlung Code:

$p = explode("-",$listing[ohtime1]); //01:00 - 03:00 
    $time1 = trim($p[0]); //01:00 
    $time2 = trim($p[1]); //03:00 
    $hour1 = substr($time1,0,2); //01 
    $hour2 = substr($time2,0,2); //03 
    $min1 = explode(":",$time1); 
    $min2 = explode(":",$time2); 
    $min1 = $min1[1]; //00 
    $min2 = $min2[1]; //00 

    //convert all times to 24 hour 
    if($hour1 < 9) $hour1 = $hour1+12; //13 
    if($hour2 < 9) $hour2 = $hour2+12; //15 
    $listing[ohtime1] = $hour1.":".$min1." - ".$hour2.":".$min2; //13:00 - 15:00 
    $listing[hour1] = $hour1; 
    $listing[hour2] = $hour2; 

Konvertierung war nicht schwierig, aber ist ratlos, wie sie zu sortieren. Ich bin nicht in der fortgeschrittenen SQL-Theorie versiert, um die Umwandlung zu 24 Stunden zu implementieren, die ich in PHP in mysql tat. Ich dachte auch, ich könnte eine Sortierfunktion implementieren, wenn ich die neuen Arrays erstelle, aber ich bin wieder ratlos. Hier ist der Code zum Trennen in die neuen Arrays:

foreach($openhouse_date_fields as $oh){ //3 possible open house dates 
if(substr($listing[$oh], 0,10) == $date) { //if any of the listings's open houses match the first search date 
    if($listing[sect] == "Brooklyn") { 
     $listingsb[$listing[displayaddress]] = $listing; 
    } 
    else 
     $listingsm[$listing[displayaddress]] = $listing; 
} 
elseif(substr($listing[$oh], 0,10) == $date2) { //if any of the listings's open houses match the second search date 
     if($listing[sect] == "Brooklyn") 
     $listingsb2[$listing[displayaddress]] = $listing; 
     else 
     $listingsm2[$listing[displayaddress]] = $listing; 
} 
} 

Ich hoffe, das ist genug Informationen. Danke, dass Sie sich die Zeit genommen haben, zu lesen und Feedback zu erhalten!

Antwort

0

Hier ist ein Beispiel von TIME zu einem Paar von Spalten vom Typ einen der TINYTEXT Spalten Umwandlung:

SELECT 
MAKETIME(start_hour + IF(start_hour<9, 12, 0), start_minute, 0) AS start_time, 
MAKETIME(finish_hour + IF(start_hour<9, 12, 0), finish_minute, 0) AS finish_time 
FROM (
SELECT 
    SUBSTRING_INDEX(SUBSTRING_INDEX(ohtime1, ' - ', 1), ':', 1) AS start_hour, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(ohtime1, ' - ', 1), ':', -1) AS start_minute, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(ohtime1, ' - ', -1), ':', 1) AS finish_hour, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(ohtime1, ' - ', -1), ':', -1) AS finish_minute 
FROM MyOpenHouseTable) t 
ORDER BY start_time;