2016-10-03 4 views
0

So bin ich ein wenig verwirrt. Mein Kunde wählt 01.10.2016 ($ datefrom variable) und 10-02-2016 ($ datumvariable). Wenn er ausgeführt wird, wird es die Daten für das Jahr 2015 zurückkehren und 2016.Ich habe eine MySQL-Datumsformatierung, die alte Datensätze zurückgibt

Hier ist meine PHP-Code:

$datefrom = $mysqli->real_escape_string($_GET['datefrom']); 

$dateto = $mysqli->real_escape_string($_GET['dateto']); 

$query = "SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%m-%d-%Y') BETWEEN '$datefrom' AND '$dateto') AND date_type='1'"; 

Wenn ich die folgende Abfrage in MySQL (nur die Variablen ersetzt):

SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%m-%d-%Y') BETWEEN '10-01-2016' AND '10-02-2016') AND date_type='1'; 

Es läuft und gibt sowohl 2015 und 2016 Datumsaufzeichnungen.

Wenn ich die DATE_FORMAT Linien und die Variablen wie folgt ändern:

SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%Y-%m-%d') BETWEEN '2016-10-01' AND '2016-10-02') AND date_type='1'; 

Es fein läuft, nur 2016 aktuelle Aufzeichnungen zu geben.

Das System ist etwa ein Jahr alt, LOL, daher gibt es jetzt die Fehler. Wie korrigiere ich die SQL-Syntax, damit sie korrekt abfragt, ohne den PHP-Code in der Zeile mit der% d-% m-% Y-Formatierung ändern zu müssen?

Danke für jede Hilfe euch zur Verfügung stellen kann, Jim

+1

Also das ist der 2016. Tag des ersten Monats nach dem 10. Jahr? – Strawberry

+0

Ich würde die Daten in PHP analysieren, um die Verwendung von DATE_FORMAT im SQL-Satz zu vermeiden. Ihre Abfrage analysiert alle Daten der Tabelle. Wenn Sie stattdessen das Datum richtig formatiert übergeben, wird dies nicht gemacht und vielleicht ist der Fehler auf diese Weise. –

Antwort

0

Da Ihre Daten sind nicht in yyyy-mm-dd Format, wird MySQL sie als STRINGS sein zu vergleichen, nicht Daten.

Das

10-23-2016 > 10-24-2015 

Mittel FALSCH, weil 3 kleiner als 4 in String-Vergleiche ist. Die Tatsache, dass wir Menschen wissen, dass es ein Date ist und wissen, dass 2016 nach 2015 kommt, ist irrelevant. MySQL ist nicht menschlich, es ist keine KI, und wenn es Strings sieht, vergleicht es sie als Strings.

Wenn Sie "Datum Mathe" in MySQL tun möchten, dann müssen Sie die nativen Formate verwenden. Diese

0

Versuchen,

$datefrom = $mysqli->real_escape_string($_GET['datefrom']); 

$dateto = $mysqli->real_escape_string($_GET['dateto']); 

$query = "SELECT * FROM tbl_Dates WHERE date BETWEEN STR_TO_DATE('$datefrom','%m-%d-%Y') AND STR_TO_DATE('$dateto','%m-%d-%Y')) AND date_type='1'"; 

STR_TO_DATE wird formatiert Zeichenfolge Datum konvertieren,

DATE_FORMAT() wird formatiert String-Darstellung konvertieren. Hier

0

ist, was funktioniert hat:

$query = "SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%Y-%m-%d') BETWEEN STR_TO_DATE('$datefrom', '%m-%d-%Y') AND STR_TO_DATE('$dateto', '%m-%d-%Y')) AND date_type='1'"; 
Verwandte Themen