Probleme mit einer mysql abfrage

Alexnder Ruff

Mitglied
Moin Moin, ich habe ein kleines problem mit einer abfrage.

Ich habe ein feld in den ein Datum eingetragen wird im Format dd.mm.jjjj

Ich möchte jetzt eine abfrage machen bei der ich einen Datumsbereich zwischen x und y abfrage

Diese sieht wie folgt aus:
PHP:
 SELECT *
FROM `fahrten`
WHERE name = "Mustermann"
AND vorname = "Max"
AND datum
BETWEEN '01.11.2009'
AND '25.11.2009'
LIMIT 0 , 30

Leider kommen dabei falsche ergebnisse raus. Z.b: daten vom 01.08.2009.

Woran kann das liegen ?

Alex
 
Du vergleichst Datums als Strings. Das geht nur im Format YYYYMMDD (so kann man Datumsstrings sortieren - ergo geht so auch das between).

Du solltest mit STR_TO_DATE() deine Strings in Date konvertieren

Code:
SELECT 
    *
FROM 
    fahrten
WHERE 
    name = "Mustermann"
    AND vorname = "Max"
    AND STR_TO_DATE('%d.%m.%Y', datum)
        BETWEEN STR_TO_DATE('%d.%m.%Y', '01.11.2009')
        AND STR_TO_DATE('%d.%m.%Y', '25.11.2009')
LIMIT 0 , 30

Nachtrag:
Natürlich währe es noch viel besser, Datum auch als Datum speichern. Oder mindestens als Zahl
 
Muss mal kurz was Offtopic sagen: Der Plural von Datum ist in Deutschland Daten. Damit man das aber nicht mit der anderen Bedeutung von Daten verwechselt, sollte man die österreichische Variante Datümer verwenden. Danke.
 
Nabend,

erst mal danke für den Tip !

Ich habe das Datum als Varchar stehen.

Leider kommt bei der Abfrage von Dir auch nox raus !

Hast Du noch eine Idee ?

Vielen Dank schon einmal !

Alex
 
Muss mal kurz was Offtopic sagen: Der Plural von Datum ist in Deutschland Daten. Damit man das aber nicht mit der anderen Bedeutung von Daten verwechselt, sollte man die österreichische Variante Datümer verwenden. Danke.

Datümer ist genauso falsch (allenfalls Dialekt). Korrekt ist nur Daten (oder lateinisch Data). Wem das nicht gefällt, der sollte ein Synonym verwenden (Zeitpunkte, Termine, etc.).
 
Zuletzt bearbeitet:
Mach mal ein Dump deiner Tabelle (inkl. dem Create-Table-Script und Testdaten) und stell sie uns zur Verfügung.
 
Meine Empfehlung wäre die Tabelle umzuschreiben und die mysql timestamp variante zu verwenden.
Damit kannst du dann auch mit BETWEEN arbeiten was dann auch die sauberste Implementation wäre.
 
Nabend,

wie gewünscht einmal den Dump der Tabelle.

Code:
CREATE TABLE IF NOT EXISTS `fahrten` (
  `id` int(11) NOT NULL auto_increment,
  `datum` varchar(20) NOT NULL,
  `fahrer` varchar(200) default NULL,
  `anrede` varchar(5) NOT NULL,
  `name` varchar(100) NOT NULL,
  `vorname` varchar(100) NOT NULL,
  `strasse` varchar(100) NOT NULL,
  `nr` varchar(25) NOT NULL,
  `plz` int(5) NOT NULL,
  `ort` varchar(100) NOT NULL,
  `abfahrtsort` varchar(100) NOT NULL,
  `zielort` varchar(100) NOT NULL,
  `entfernung` int(20) NOT NULL,
  `preis` double(10,2) NOT NULL,
  `eingabe_datum` varchar(20) NOT NULL,
  `bemerkung` text,
  `mwst` int(10) NOT NULL,
  `bezeichnung` varchar(100) NOT NULL,
  `abgerechnet` varchar(1) character set latin1 collate latin1_german2_ci default NULL,
  `mahn1` varchar(1) character set latin1 collate latin1_german2_ci default NULL,
  `mahn2` varchar(1) character set latin1 collate latin1_german2_ci default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin2 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=5 ;

--
-- Daten für Tabelle `fahrten`
--

INSERT INTO `fahrten` (`id`, `datum`, `fahrer`, `anrede`, `name`, `vorname`, `strasse`, `nr`, `plz`, `ort`, `abfahrtsort`, `zielort`, `entfernung`, `preis`, `eingabe_datum`, `bemerkung`, `mwst`, `bezeichnung`, `abgerechnet`, `mahn1`, `mahn2`) VALUES
(1, '20.10.2009', '3', 'Herr', 'Ruff', 'Alexander', 'Am Pulverbach', '1', 21244, 'Buchholz in der Nordheide', 'Achtern Hoagen', 'Achtern Hoagen', 12, 22.25, '25.11.2009-15 : 43 ', NULL, 7, 'Peronenbeförderung', NULL, NULL, NULL),
(2, '01.11.2009', '3', 'Frau', 'Ruff', 'Alexander', 'Am Pulverbach', '1', 21244, 'Buchholz in der Nordheide', 'Achtern Hoagen', 'Achtern Hoagen', 12, 22.25, '25.11.2009-15 : 45 ', NULL, 7, 'Krankenkassenfahrt', NULL, NULL, NULL),
(3, '05.11.2009', '3', 'Herr', 'Ruff', 'Alexander', 'Musterstr. ', '1', 21244, 'Buchholz', 'Achtern Hoagen', 'Achtern Hoagen', 12, 22.25, '25.11.2009-15 : 46 ', NULL, 7, 'kurierfahrt', NULL, NULL, NULL),
(4, '25.11.2009', '3', 'Std f', 'Std fahrt', 'Std fahrt', 'Std fahrt', 'Std fahrt', 0, 'Std fahrt', 'Achtern Hoagen', 'Achtern Hoagen', 12, 22.25, '25.11.2009-15 : 46 ', NULL, 7, 'Personenbeförderung', NULL, NULL, NULL);

Ich stehe mit mysql noch am Anfang
 
Oh, man sollte immer hinterfragen was andere als Beispiel posten.
Befehle die man nicht kennt mal nachschlagen. So auch meine. Ich habe den STR_TO_DATE falsch herum angewendet

PHP:
SELECT 
    *
FROM 
    fahrten
WHERE 
    name = "Mustermann"
    AND vorname = "Max"
    AND STR_TO_DATE(datum, '%d.%m.%Y')
        BETWEEN STR_TO_DATE('01.11.2009', '%d.%m.%Y')
        AND STR_TO_DATE('25.11.2009', '%d.%m.%Y')
 
Zurück