Timestamp zwischen zwei Datumswerten falsch ausgegeben

preko

Erfahrenes Mitglied
Hallo,

ich habe eine MySQL Abfrage, die im Prinzip eine Ausgabe generieren soll, die zwischen zwei Daten liegen soll. Dabei verarbeite ich zwei Formularangaben (Start- und Enddatum).

Start- (01.01.1960) und Enddatum (31.12.1970) liegen in der Datenbank im Format: TT.MM.JJJJ vor, die ich bei der MySQL Abfrage in den entsprechenden Timestamp umwandle und mit dem Timestamp des Geburtstages (Spalte: Geb.-Dat.) vergleiche.

Zur ergänzenden Info: die Spalte Zuweisung ist das Datum, wann der Kunde erfasst wurde.

So sieht mein PHP Code aus:
PHP:
$sql_query = "SELECT"."\n";
$sql_query .= "      *,"."\n";
$sql_query .= "      UNIX_TIMESTAMP(STR_TO_DATE((CONCAT(`Geb.-Dat.`, ', 00:00')), '%d.%m.%Y, %H:%i')) AS UnixGeburt,"."\n";
$sql_query .= "      UNIX_TIMESTAMP(STR_TO_DATE((CONCAT(`Zuweisung`, ', 00:00')), '%d.%m.%Y, %H:%i')) AS UnixZuweisung"."\n";
$sql_query .= "FROM"."\n";
$sql_query .= "      `kunden`"."\n";
$sql_query .= "WHERE"."\n";
$sql_query .= "      'UnixZuweisung' >= '1167606000'"."\n\n"; // Bezugsdatum/Timestamp ist der 01.01.2007
$sql_query .= "AND   UNIX_TIMESTAMP(STR_TO_DATE((CONCAT(`Geb.-Dat.`, ', 00:00')), '%d.%m.%Y, %H:%i')) >= ".$jahrgangVon." "."\n";
$sql_query .= "AND   UNIX_TIMESTAMP(STR_TO_DATE((CONCAT(`Geb.-Dat.`, ', 00:00')), '%d.%m.%Y, %H:%i')) <= ".$jahrgangBis." "."\n";
$sql_query .= "\n"."ORDER BY"."\n";
$sql_query .= "      `UnixGeburt` DESC "."\n";

So sieht dann die SQL Abfrage aus:
SQL:
SELECT
      *,
      UNIX_TIMESTAMP(STR_TO_DATE((CONCAT(`Geb.-Dat.`, ', 00:00')), '%d.%m.%Y, %H:%i')) AS UnixGeburt,
      UNIX_TIMESTAMP(STR_TO_DATE((CONCAT(`Zuweisung`, ', 00:00')), '%d.%m.%Y, %H:%i')) AS UnixZuweisung
FROM
      `kunden`
WHERE
      'UnixZuweisung' >= '1167606000'
 
AND   UNIX_TIMESTAMP(STR_TO_DATE((CONCAT(`Geb.-Dat.`, ', 00:00')), '%d.%m.%Y, %H:%i')) >= -315622800
AND   UNIX_TIMESTAMP(STR_TO_DATE((CONCAT(`Geb.-Dat.`, ', 00:00')), '%d.%m.%Y, %H:%i')) <= 31446000
 
ORDER BY
      `UnixGeburt` DESC

Trotzdem bekomme ich z. B. folgende Ausgabe:
Startdatum : 01.01.1960 (-315622800),
Enddatum : 31.12.1970 (31446000)
Geburtsdatum: 27.03.1955 (-466045200) oder
Geburtsdatum: 30.06.1958 (-363142800)

Hat jemand mal `ne Idee, was hier falsch laufen könnte? Übersehe ich etwas?

Beste Grüße!
 
item: 'UnixZuweisung' >= '1167606000'
Du willst wirklich den String "UnixZuweisung" vergleichen? Halte ich persönlich für eine schlechte Idee

item: Wozu der unnötige CONCAT? STR_TO_DATE(`Geb.-Dat-`,'%d.%m.%Y') Reicht doch völlig aus

item: Warum arbeitest du nicht mit BETWEEN?

item: Negative Timestamps kann MySql nicht handeln. Folgender Test ergibt bei MySQL für negative Timestamps immer 0: http://sqlfiddle.com/#!2/edcf0/2
In deinem Beispiel wird also 0 BETWEEN -315622800 AND 31446000 verglichen.
Du kannst in MySQL nicht mit Timestamp arbeiten, wenn dieser Negativ sein sollte.
Hier findest du eine komplizierte Lösung für dein Problem: http://stackoverflow.com/questions/...hich-is-before-1970-into-a-timestamp-in-mysql

item: Du solltest keine Spaltennamen mit Sonderzeichen verwenden

Fazit: Du solltest mit DATE arbeiten, nicht mit Strings und nicht mit Unixtimestamps
 
Hi Yaslaw,

vielen Dank für die schnelle und hilfreiche Antwort.

Ich habe einige Gründe mit dem System so zu arbeiten, wie z. B. die Tatsache, dass ich die Datenbankfelder so übernommen habe (Altlasten) und die Zeit bisher fehlte, mal ein Redesign zu machen.

Mit BETWEEN zu arbeiten ist o.k., allerdings auch nur, wenn beide Werte gegeben sind. Es kann durchaus aus sein, dass der/die Anwender "nur" den von-Wert und nicht den bis-Wert angeben oder umgekehrt (je nach entsprechendem Abfragebedarf, der verschiedene Möglichkeiten bieten muss).

Den Rest schaue ich mir mal in Ruhe an.

Beste Grüße!
 
Dann empfehle ich dir das folgende, geht 1 Minute. Und dann kannst du sauber damit arbeiten.
SQL:
ALTER TABLE kunden
ADD COLUMN(
     geb_date  date,
     zuweisungs_date
);

UPDATE
    kunden
SET
    geb_date = STR_TO_DATE(`Geb.-Dat.`, '%d.%m.%Y'),
    zuweisungs_date = STR_TO_DATE(Zuweisung`, '%d.%m.%Y')
;
COMMIT;

Das umwandeln deiner PHP-timestamps kannst du in PHP machen
PHP:
$mysqldate = date('Y-m-d H:i:s', $phpdate);
$phpdate = strtotime( $mysqldate );
 
Hi Yaslaw,

vielen Dank für die Info, habe allerdings eine Kleinigkeit korrigiert bei "STR_TO_DATE(`Zuweisung`, '%d.%m.%Y');" fehlte ein einfaches einleitendes Hochkomma:
PHP:
 $sql_query = "UPDATE 'kunden' SET `gebDate` = STR_TO_DATE(`Geb.-Dat.`, '%d.%m.%Y'), `zuweisungsDate` = STR_TO_DATE(`Zuweisung`, '%d.%m.%Y');
COMMIT;
";

Damit ist die Geschichte gegessen! Prima! :)

Beste Grüße!
 
Zurück