2016-05-22 8 views
0

Ich habe seit einer Weile versucht, unzählige stackoverflow Antworten zu lesen und kann es immer noch nicht knacken!Wählen Sie zwischen den Daten aus der Tabelle - strtotime?

Ich habe eine Tabelle in meiner Datenbank mit einem Feld namens dob. Dieses Feld ist momentan nur ein TEXT-Feld (aber ich habe seitdem versucht, es in ein DATUM-Feld zu ändern und kann es immer noch nicht zum Laufen bringen).

Die Daten des DOB-Feldes sind in diesem Format (UK Datum) - 22/05/2016.

Ich versuche herauszufinden, die Anzahl der Benutzer, die Geburtstage sind zwischen zwei Daten.

zum Beispiel jeder, der in den letzten zwei Jahren geboren wurde:

$twoyearsago=date('d/m/Y', strtotime("-2 years")); 
$today = date("d/m/Y"); 

$sql = mysql_query("SELECT * FROM users WHERE dob >= '" . $twoyearsago . "' AND date <= '" . $today . "' ORDER by id DESC"); 

ich auch versucht:

$sql = mysql_query("SELECT * FROM users WHERE dob BETWEEN '" . date('d-m-Y', strtotime($twoyearsago)) . "' AND '" . date('d-m-Y', strtotime($today)) . "'"; 

Hoffentlich können Sie sehen, wo ich Logik ist und in der Hoffnung werden Sie sehen, wo im schief gehen - jede Hilfe wäre willkommen.

Jack

+0

Ich vermute, dass die Daten in der Datenbank Zeitstempel sind? – Qirel

+0

Dies kann nur gemacht werden, wenn Ihre Daten im 'Jahr-Monat-Tag'-Format sind – Peter

Antwort

1

Das Problem mit vielen lokalen Datumsformaten ist, dass ihre lexikalische und chronologische Reihenfolge unterschiedlich ist (zB 16-11-2016 kommt nach dem 11-12-2016 lexikalisch, aber zeitlich vor). Aus diesem Grund ist es in den meisten Fällen eine schlechte Idee, Daten in Zeichenkettenfeldern in einem regionalen Format zu speichern: Früher oder später werden Sie Probleme mit der Sortierung bekommen.

Als nächstes, wenn Termine wahrsten Sinne des Wortes für MySQL Angabe, müssen Sie bestimmte Formate respektieren, wie in the documentation

, dass in die Praxis umsetzen erklärt, die Bereichsvariablen wie folgt aussehen sollte:

$today = date("Y-m-d"); 
$twoyearsago=date("Y-m-d", strtotime("-2 years")); 

Dann wir verwenden, um eine integrierte Funktion str_to_date die String-Spalte in ein Datum zu konvertieren, die korrekt verglichen werden kann:

SELECT * FROM users WHERE 
STR_TO_DATE(dob, '%d/%m/%Y') between '$twoyearsago' and '$today' 

Das funktioniert, aber auf lange Sicht ist es viel besser, diese dob-Spalte in ein echtes Datumsformat umzuwandeln (wie @BerndBuffen zeigt), da es klarer, leichter zu internationalisieren und viel besser abläuft.

Hinweis: Sie verwenden immer noch die lange veraltete Erweiterung mysql_. Sie sollten wirklich zu entweder mysqli_ oder PDO wechseln.

2

Mit STR_TO_DATE können Sie Ihr Datum konvertieren

HINWEIS: Ich habe den Spaltentyp von TIMESTAMP DATE geändert, denn in einem TIMESTAMP Sie Datum vor 1970-01- speichern 01.

SELECT STR_TO_DATE ('22/05/2016 ','% d /% m /% Y ');

Probe

MariaDB [bb]> SELECT STR_TO_DATE('22/05/2016','%d/%m/%Y'); 
+--------------------------------------+ 
| STR_TO_DATE('22/05/2016','%d/%m/%Y') | 
+--------------------------------------+ 
| 2016-05-22       | 
+--------------------------------------+ 
1 row in set (0.00 sec) 

MariaDB [bb]> 

so können Sie Sie Tabelle

ALTER TABLE `users` 
ADD COLUMN new_dob DATE; 

UPDATE `users` SET new_dob = str_to_date(dob,'%d/%m/%Y'); 

** Verify the dates 

ALTER TABLE `users` 
DROP COLUMN dob; 

ALTER TABLE `users` 
CHANGE COLUMN `new_dob` `dob` DATE; 

** CREATE an INDEX for perfomance ** 

ALTER TABLE `users` 
ADD KEY (`dob`); 

SELECT

SELECT * from `users` where dob between '2014-01-01' AND `2015-08-01'; 
ändern
+0

Ich habe meine Antwort mit einem Index auf DOB für bessere Leistung ändern –

+0

Danke - dachte, ich brauchte, um das Feld zu einem DATUM stattdessen zu ändern von Text. – it05jb

0

Sie nee d, um Ihre Abfrage zu erstellen, indem Sie tatsächliche Datumswerte, keine Zeichenfolge verwenden. Sie brauchen also das Format YYYY-MM-DD in der Query - beide Seiten des Vergleichs.

Versuchen Sie Folgendes.

$twoyearsago=date('Y-m-d', strtotime("-2 years")); 
$today = date("Y-m-d"); 

$sql = mysql_query("SELECT * FROM users WHERE STR_TO_DATE(dob, '%d/%m/%Y') >= '" . $twoyearsago . "' AND STR_TO_DATE(dob, '%d/%m/%Y') <= '" . $today . "' ORDER by id DESC"); 

STR_TO_DATE (dob, '% d /% m /% Y') stellt sicher, dass Sie Ihre d/m/Y dob String-Wert gespeichert in der Abfrage Datum umgewandelt werden, die MySQL mit dem verstehen und vergleichen angegebene YYYY-MM-DD-Werte. Eigentlich ist der richtige Weg, ein Datumsfeld zu erstellen und DOB-String-Werte als Datum in dieses neue Feld zu übertragen, indem Sie dieselbe Funktion verwenden, es sei denn, Sie erhalten immer die Datumswerte als String in das DOB-Feld.

0

Eine andere Methode ist, DateTime zu verwenden und das Datum zu formatieren, bevor Sie Ihre Abfrage ausführen.

$begin = '10/02/2014'; 
$emd = '10/02/2015'; 

$beginDate = DateTime::createFromFormat('d/m/Y', $begin); 
$emdDate = DateTime::createFromFormat('d/m/Y', $emd); 

$stmt = " 
SELECT 
... 
FROM users 
WHERE birthday >= '".$beginDate->format('Y-m-d')."' 
AND birthday <= '".$endDate->format('Y-m-d')."' 
"; 
Verwandte Themen