2016-04-17 15 views
2

Ich habe eine Tabelle, die clientbikeSuche zwischen zwei Daten mit MYSQL/SQL?

SELECT stime ist, etime VON clientbike

stime  | etime 
    -------------------------- 
    2016-04-01 | 2016-04-30 

wenn jemand stime = 2016.04.05 & etime = 2016-04-07

Ergebnis Suche gefunden

Kann jemand erklären, wie man sql/mysql benutzt?

Thnaks

+0

eine Idee, über diese Frage ... –

+0

Welche Datentyp sind 'stime' und' etime'? –

+1

Es ist mir etwas unklar, was Sie erreichen wollen. Möchten Sie die Anzahl der Tage von '2016-04-05' bis '2016-04-07' zählen? Das wäre meiner Meinung nach 3 (5., 6., 7.). Könnten Sie bitte Ihre Frage klären? Enthält Ihre Tabelle nur eine Zeile? – PerlDuck

Antwort

-1

Da ein Datumzeit ohne Angabe eines Zeitsegment einen Wert von Datum haben 00: 00: 00.000, wenn Sie sicher sein möchten, dass Sie alle Termine in Ihrem Bereich erhalten, müssen Sie entweder liefern die Zeit für Ihr Enddatum oder erhöhen Sie Ihr Enddatum und verwenden Sie <.

select Datum, TotalAllowance aus der Berechnung in dem EmployeeId = 1 und Datum zwischen '2011.02.25' und '2011/02/27 23: 59: 59.999'

OR

wählen Sie Datum, TotalAllowance aus Berechnung, wo EmployeeId = 1 und Datum> = '2011.02.25' und Datum < '2011/02/28'

OR

select Datum, TotalAllowance aus der Berechnung in dem EmployeeId = 1 und Date> = '2011.02.25' und Datum < = '2011/02/27 23: 59: 59.999'

Verwenden Sie NICHT die folgenden, da es einige Aufzeichnungen vom 2011/02/28 zurückgeben könnte, wenn ihre Zeiten 00: 00: 00.000 sind.

wählen Sie Datum, TotalAllowance aus Berechnung, wo EmployeeId = 1 und Datum zwischen ‚2011.02.25‘ und ‚2011/02/28‘

0

Sie müssen nur unter Abfrage kopieren und ausführen In mysql können Sie dann sehen, dass diese Abfrage die Anzahl der Zählereinträge vom Startzeitpunkt bis zum Enddatum zurückgibt.

Sie dies auf zwei Art und Weise erreichen können,
Option 1

SET @FromDate := '2016-04-1' 
    SET @ToDate := '2016-04-30' 

    SELECT COUNT(*) FROM clientbike 
    WHERE stime >= @FromDate AND etime <= @ToDate 

Dies deckt alle Datumsbereich Szenario wie ausgewählte @FromDate und @ToDate beide sind innerhalb von Start- und End-Spalte in der Tabelle.

Option 2

 SET @FromDate := '2016-04-1' 
    SET @ToDate := '2016-04-30' 
    SELECT count(*) FROM clientbike WHERE stime BETWEEN @FromDate AND @ToDate AND etime BETWEEN @FromDate AND @ToDate 
+0

'DECLARE @FromDate DATE = '2016-04-1'' funktioniert nicht in MySQL, versuche' SET @FromDate: =' 2016-04- 1'' stattdessen. –

+0

@Paul Spiegel Danke Kumpel, ich habe geändert. –

+0

Dies wird nicht funktionieren. Unter Verwendung der Beispieltabelle, die der OP gab, würden beide Abfragen "1" zurückgeben, da Sie die Anzahl der Datensätze in "clientbike" zählen, aber die Anzahl der Tage. – JRLambert

0

Wenn ich richtig verstehe, sind Sie wollen die Anzahl der überlappenden Tage, mit der EndDate exklusiv zu sein. Wenn das richtig ist dann mit dieser beginnen:

SELECT * 
FROM clientbike 
WHERE stime <= @ToDate 
    AND etime >= @FromDate; 

Diese Abfrage alle Datensätze aus clientbike zurück, die die gesuchten Daten überlappen. Strukturierung der WHERE Klausel auf diese Weise überprüft Startüberhang, Ende Überhang, @ToDate und @FromDate zwischen sdate und edate und sdate und edate zwischen @ToDate und @FromDate zu sein.

Als nächstes müssen wir die SELECT ändern:

SELECT GREATEST(stime, @FromDate) AS startDate, 
    LEAST(etime, @ToDate) AS endDate 
FROM clientbike 
WHERE stime <= @ToDate 
    AND etime >= @FromDate; 

Der Punkt GREATEST und LEAST ist, um sicherzustellen, dass wir nur an den Tagen suchen, die tatsächlich überlappen. EX: wenn stime = '2016-04-15' und @FromDate = '2016-04-22', dann GREATEST(stime, @FromDate) = '2016-04-22'. Wir werden dann diese beiden Felder verwenden, um die Datumsdifferenz zwischen startDate zu berechnen und endDate:

SELECT GREATEST(stime, @FromDate) AS startDate, 
    LEAST(etime, @ToDate) AS endDate, 
    DATEDIFF(LEAST(etime, @ToDate), GREATEST(stime, @FromDate)) as overlap 
FROM clientbike 
WHERE stime <= @ToDate 
    AND etime >= @FromDate; 

Der einzige Teil des SELECT dass die DATEDIFF() Funktion zählt, ist, so dass die vorhergehenden zwei Halbbilder entfernt werden kann. Ich habe sie einfach vergessen, damit du sehen kannst, was vor sich geht.

0

Angesichts der einen Fall in der Spezifikation, ist es ziemlich einfach. Was in der Spezifikation fehlt, sind Beispiele von Stime- und/oder Zeitwerten, die gleich sind oder ganz oder teilweise außerhalb des Clientbike-Bereichs liegen. Oder ätime Werte, die gleich sind. Für Suchparameter und für Spaltenwerte. (Ich vermute stark, dass es mehr zu der Spezifikation als nur den einen Fall gibt.)

Als Ausgangspunkt ist hier ein Beispiel, das passiert, um für den Fall in der Spezifikation zu "arbeiten". Dies gibt eine Zeile für jede Zeile in Clientbike zurück.

Setup

CREATE TABLE clientbike 
(id  BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY 
, stime DATE NOT NULL 
, etime DATE NOT NULL 
); 

INSERT INTO clientbike (stime,etime) VALUES 
('2016-04-01','2016-04-30') 
, ('2016-05-01','2016-05-30') ; 

Beispiel Abfrage

SELECT b.id 
    , IF(q.etime >= b.stime AND q.stime < b.etime, DATEDIFF(q.etime,q.stime), 0) AS days 
    FROM clientbike b 
CROSS 
    JOIN (SELECT '2016-04-05' + INTERVAL 0 DAY AS stime 
       , '2016-04-07' + INTERVAL 0 DAY AS etime 
     ) q 
ORDER BY b.id 

HINWEIS: Die "Suche" Werte werden in der Inline-View q geliefert.

kehrt

id days 
---- ---- 
    1  2 
    2  0 

Als lächerlich Beispiel einer anderen Abfrage, die auch die gegebene Spezifikation erfüllen würde, aber wäre praktisch unmöglich, auf andere Fälle zu erweitern ...

SELECT b.id 
    , IF( b.stime = '2016-04-01' 
      AND b.etime = '2016-04-30' 
      AND q.stime = '2016-04-05' 
      AND q.etime = '2016-04-07' 
     , '2 Days...' 
     , '' 
     ) AS result 
    FROM clientbike b  
CROSS 
    JOIN (SELECT '2016-04-05' + INTERVAL 0 DAY AS stime 
       , '2016-04-07' + INTERVAL 0 DAY AS etime 
     ) q 

kehrt

id result 
---- --------- 
    1 2 Days... 
    2