2016-04-17 9 views
0

Ich habe eine Tabelle, die clientbikeAbfrage zwischen zwei Daten mit SQL?

SELECT stime,etime FROM clientbike 

type = datetime 

Ergebnis ist

stime    | etime 
-------------------------------------------- 
2016-04-18 00:00:00 | 2016-05-18 00:00:00 
-------------------------------------------- 
2016-04-05 00:00:00 | 2016-06-05 00:00:00 
-------------------------------------------- 
2016-04-03 00:00:00 | 2016-07-03 00:00:00 

Jetzt möchte ich Funktion suchen:

alle Ergebnis-Abfrage gefunden 0, aber ich 3 wollen ...

Suchabfrage mit> = AND < =

SELECT stime,etime FROM clientbike WHERE 
    stime >= '2016-04-25 00:00:00' AND 
    etime <= '2016-04-26 00:00:00' 

Wrong

No Result Found... 

Suchabfrage zwischen

SELECT stime,etime FROM clientbike WHERE 
    stime BETWEEN '2016-04-25 00:00:00' AND '2016-04-26 00:00:00' AND 
    etime BETWEEN '2016-04-25 00:00:00' AND '2016-04-26 00:00:00' 

Wrong

No Result Found... 

Suchabfrage mit Verwendung von mit str_to_date

SELECT stime,etime FROM clientbike WHERE 
    STR_TO_DATE(stime, '%Y-%m-%d') BETWEEN '2016-04-25 00:00:00' AND '2016-04-26 00:00:00' AND 
    STR_TO_DATE(etime, '%Y-%m-%d') BETWEEN '2016-04-25 00:00:00' AND '2016-04-26 00:00:00' 

Wrong

No Result Found... 

Kann jemand dieses Verhalten erklären?

+1

Seien Sie sehr vorsichtig über Termine 'd-m-Y 'zu schreiben. Je nachdem, wo du lebst, bedeutet es verschiedene Dinge. Schreibe die Daten "Y-m-d". – Scopey

+0

ja, aber date copy für exit data ... –

+0

ich benutze nicht y-m-d, ich benutze nur d-m-Y –

Antwort

2
stime  | etime 
------------------------ 
15-04-2016 | 31-06-2016 

Das Format bedeutet, dass Ihre Felder sind varchar s und nicht date daher kann man sie nicht vergleichen gewöhnlich wie date s verglichen werden kann.

Wenn Sie das richtige Feld date Typ verwenden, wäre das Format YYYY-MM-DD und dann würde jeder Standardvergleich funktionieren. Da dies nicht der Fall ist, müssen Sie diese Zeichenfolgen in Daten konvertieren, um sie korrekt zu vergleichen.

beste Vorgehensweise ist Ihre Felder zu ändern richtigen Datentyp für diesen Zweck zu verwenden, und das ist DATE

+0

aber ich benutze nur dmY –

+0

Wenn ich Date-Wert in Mysql verwenden mein Datumsformat automatisch ändern und zeigen "YYYY-MM-DD" ... –

+0

how to chnage Datumsformat TT-MM-JJJJ –

0

Sie haben Ihre Spalten zu konvertieren, wie Termine zu

STR_TO_DATE(stime, '%Y-%m-%d') 

Bitte versuchen Sie diese

SELECT stime,etime FROM clientbike 
    WHERE STR_TO_DATE(stime, '%Y-%m-%d') BETWEEN '2016-04-01' AND '2016-04-17' 
    AND STR_TO_DATE(etime, '%Y-%m-%d') BETWEEN '2016-05-01' AND '2016-07-26' 

oder

i n Ihre Datenbank, die Spalte von Varchar auf das Datum ändern oder Datumzeit

EDIT

sqlfiddle example

+0

Ja, gut! Ich denke OP wird diesen Weg gehen, denn sie scheinen nicht bereit zu sein, Änderungen an ihrer bestehenden Struktur vorzunehmen. –

+0

Versuchen Sie, diese aktualisierten Daten zu verwenden, und Sie werden Ergebnisse erhalten. Sie haben kein Ergebnis, weil die Daten sind vorbei Sie suchen Daten, und kein Wert entspricht –

+0

Check sqlfiddle Beispiel –

0

Das erste, was ich Ihre stime und etime Spalte Zeichenfolge in Ihrer Frage sehen kann, ist Typ so Datentyp Datum ändern In der Datenbank und zum Debuggen können Sie die folgende Abfrage überprüfen.

Sie müssen nur unter Abfrage kopieren und in mysql ausführen, dann können Sie sehen, dass diese Abfrage Anzahl der Zählereinträge vom Starting-Datum 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 
Verwandte Themen