2009-04-03 36 views
0

Ich habe eine Tabelle namens TimeListSQL-Abfrage Wertebereich bekommen

SlotID   SlotStartTime SlotEndTime 
    (int identity) (varchar(10)) (varchar(10)) 
    1    8:00AM   8:15AM 
    2    8:15AM   8:30AM 
    3    8:30AM   8:45AM 
    4    8:45AM   9:00AM 
    5    9:00AM   9:15AM 
    6    9:15AM   9:30AM 
    7    9:30AM   9:45AM 
    8    9:45AM   10:00AM 

Wenn ich vorbei SlotStartTime und SlotEndTime Ich möchte mal bekommen dazwischen. habe ich die folgende Abfrage-Zeitschlitze erhalten in b/w slotStarttime 8.00 amd slotEndTime 9.00

select * from TimeList1 where StartTime >='8:00AM' and EndTime <= '9:00AM' 

Hier wird das Ergebnis wie kommt:

SlotID  SlotStartTime SlotEndTime 
    1   8:00AM   8:15AM 
    2   8:15AM   8:30AM 
    3   8:30AM   8:45AM 
    8   9:45AM   10:00AM 

Ich möchte slotstarttime bekommen ab 08.00 Uhr und endet slotendtime 09.00 Uhr bedeutet erwartete Ergebnis ist:

SlotID  SlotStartTime SlotEndTime 
    1   8:00AM   8:15AM 
    2   8:15AM   8:30AM 
    3   8:30AM   8:45AM 
    4   8:45AM   9:00AM 

Welche Änderung muss ich in meiner Anfrage machen das Ergebnis zu erhalten, wie oben ?

Antwort

0

select * from TimeList1 wo Starttime> = '8.00' und EndTime < = '9.00'

weniger als oder gleich, nicht größer oder gleich.

Obwohl wirklich, das funktioniert nicht wie Sie erwarten, wenn Ihre Spalten vom Typ Varchar sind. Verwenden Sie einen Zeit- oder Datumszeittyp.

Die ersten beiden Absätze erklären eine Sache so weit wie ich sehen kann. Der letzte Absatz enthält eine fadenscheinige Erklärung des Problems. - Jonathan Leffler

In der ursprünglichen Nachricht, bevor Sie es bearbeitet hatte die OP als seine select-Anweisung, select * from TimeList1 wo Starttime> = '8.00' und EndTime> = ‚9.00 Uhr '

Ich reagierte darauf.

Meine Antwort mag "schwach" sein, aber ich wollte das offensichtliche Problem angehen und den Typen voranbringen.

+0

Die ersten beiden Absätze erklären nicht eine Sache, soweit ich sehen kann. Der letzte Absatz enthält eine schwache Erklärung des Problems. –

0

Wenn Sie Varchars (oder Zeichenfolgen in den meisten Sprachen) verwenden, werden Sie feststellen, dass "10:00" < "9:00" nur aufgrund von Regeln für die Zeichenfolgen (seit "1" < "9").

Sie sollten Datums- und Uhrzeitwerte in Datums- und Uhrzeitspalten speichern. Wenn Sie müssen Varchars verwenden, müssen Sie sie in 24-Stunden-Format mit fester Größe konvertieren, um es richtig zu tun (z. B. "01:30", "12:15", "18:25").

Aber mein Rat ist, sie als richtige DB Datum und Uhrzeit Werte zu speichern. Ihre Anfragen werden einfacher und schneller.

Die folgende Lösung kann Sie bekommen, was Sie wollen, wenn ich Ihren Datenspeicher verstehe (ein Eintrag pro Viertelstunde), aber meine professionelle Meinung ist es, die Spaltentypen zu beheben, da dies weit aussagekräftigere Bedingungen in Ihren Select-Anweisungen ermöglicht :

select * from TimeList1 
where left(StartTime,1) = '8' 
and right(StartTime,2) = 'AM' 
0

Ihre Anfrage ist korrekt. Aber es sind Ihre Datentypen, die falsch sind.

10:00 AM kommt tatsächlich vor 9:00 AM, wenn man bedenkt, dass es sich um Zeichenketten handelt, nicht um Datetime-Werte.

Also, wenn Sie nicht die Datentypen jetzt ändern, Ihre beste Glück ist diese Abfrage, um zu versuchen:

Select * from TimeList1 
    where StartTime >= Cast('8:00AM' as datetime) 
     and EndTime <= Cast('9:00AM' as datetime) 
//make sure StartTime and EndTime is type of datetime 
0

Ein Teil des Problems ist, wie erwähnt, ist, dass Sie Strings verwenden darstellen mal. Der andere Teil Ihres Problems ist, dass die AM/PM-Notation für Rechenaufgaben völlig entsetzlich ist. Denken Sie daran, die Reihenfolge lautet:

12:00AM 
12:15AM 
12:30AM 
12:45AM 
1:00AM 
1:15AM 
... 
9:45AM 
10:00AM 
10:15AM 
... 
11:30AM 
11:45AM 
12:00PM 
12:15PM 
12:30PM 
12:45PM 
1:00PM 
1:15PM 
... 

Die 24-Stunden-Uhr hat viele Vorteile. Wenn Sie verwenden:

00:00 
00:15 
00:30 
00:45 
01:00 
01:15 
... 
09:45 
10:00 
10:15 
... 
11:30 
11:45 
12:00 
12:15 
12:30 
12:45 
13:00 
13:15 
... 

(für den gleichen Satz von Zahlen), dann könnte Ihr VARCHAR Strings in CHAR gemacht werden (5) und würde automatisch sortieren richtig in zeitlicher Abfolge. Sie müssten Ihre Abfragen immer noch richtig formulieren, einschließlich der führenden Nullstellen bei Zeiten unter 10:00, aber die Werte würden korrekt sortiert und korrekt verglichen.

Einige DBMS bieten Unterstützung für Teilmengen von Zeit. In IBM Informix Dynamic Server können Sie DATETIME HOUR TO MINUTE als Typ für die Spalte verwenden. Das würde Ihnen die Flexibilität geben, führende Nullen zu löschen.

Siehe auch Convert 12-hour date/time to 24-hour date/time.

+0

Die Reihenfolge ist schlechter als Sie denken - ich glaube nicht, dass die Zeiten mit einer einstelligen Stunde einen führenden Platz haben. – paxdiablo

+0

Ja - das Datenformat des Fragestellers ist ohne spezielle Funktionen, die die Strings in eine vernünftige Darstellung umwandeln (Minuten seit Mitternacht, höchstwahrscheinlich), nicht zu verwalten. –

0

Versuchen Sie folgendes:

SELECT * 
FROM TimeList1 
WHERE (CONVERT(datetime, CONVERT(varchar, GETDATE(), 103) + ' ' + StartTime) >= 
     CONVERT(datetime, CONVERT(varchar, GETDATE(), 103) + ' ' + '8:00AM')) 
    AND 
    (CONVERT(datetime, CONVERT(varchar, GETDATE(), 103) + ' ' + EndTime) <= 
     CONVERT(datetime, CONVERT(varchar, GETDATE(), 103) + ' ' + '9:00AM')) 
Verwandte Themen