Systzemzeit - 1 Tag

quidnovi

Erfahrenes Mitglied
Systemzeit - 1 Tag

Hi @ all,

möchte alle Datensätze ausgeben, die einen Tag vor Heute liegen.
Also - vom heutigen Datum ausgehend - möchte ich die Datensätze bis 16.04.07 ausgeben können.

Hab' jetzt schon allerhand probiert, nichts half.

So will es nicht:
PHP:
// führe hier ein paar der Abfragen auf
$abfrage="SELECT DISTINCT dat FROM r_abrechnung WHERE status = '1' AND NOW(-1) ORDER BY 'dat' DESC";

$abfrage="SELECT DISTINCT dat FROM r_abrechnung WHERE status = '1' AND SYSDATE(-1) ORDER BY 'dat' DESC";

$abfrage="SELECT DISTINCT dat FROM r_abrechnung WHERE status = '1' AND DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY 'dat' DESC";

$datum = date('d.m.Y');
$abfrage="SELECT DISTINCT dat FROM r_abrechnung WHERE status = '1' AND DATE_SUB('$datum', INTERVAL 1 DAY)<NOW() ORDER BY 'dat' DESC";

date('d.m.Y', strtotime('now -1 day'));
$abfrage="SELECT DISTINCT dat FROM r_abrechnung WHERE status = '1' AND '$datum'  ORDER BY 'dat' DESC";

Tja, die funktionieren alle nicht.

Jetzt hoffe ich auf Eure Hilfe, da ich jetzt nix mehr weiß. Danke
 
Zuletzt bearbeitet:
Hi,

ich würde so eine Abfrage schreiben:
Code:
SELECT 
                dat 
FROM 
                r_abrechnung 
WHERE 
                status = '1' 
AND 
                dat > = SYSDATE-1 

ORDER BY 'dat' DESC;
 
Hallo,

wie ist das Feld Datum in deiner Datenbank angelegt?

Mit dem Befehl: select curdate() - 1 könntest du das aktuelle Datum im Format
YYYYMMDD erzeugen. Dieses Datum könnte gegen dein Datenbankfeld abgefragt werden. Dabei tritt in mysql leider folgendes Problem auf: Wenn du den ersten Tag eines Monat deine Abfrage startest, läuft die Abfrage nicht mehr, weil mysql nicht in Tagen umrechnet, sondern aus dem Datum 20070401 das Datum 20070399 macht.
Wenn du mit dem Systemfeld SYSDATE() arbeitest, beinhaltet das Datum zusätzlich noch die Uhrzeit.

Ich würde mir in PHP ein Datum im entsprechenden Format bauen, eine Tag abziehen und dieses Feld dynamisch in die Abfrage integrieren.
Auf der Seite http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html habe ich keine brauchbare Möglichkeit für deine Zwecke entdecken können.
Scheinbar bietet mysql dies so nicht an.
 
Guten Morgen,

das habe ich schon probiert:
PHP:
date('d.m.Y', strtotime('now -1 day'));
$abfrage="SELECT DISTINCT dat FROM r_abrechnung WHERE status = '1' AND '$datum'  ORDER BY 'dat' DESC";

aber das mag nicht.

Der Hintergrund des Ganzen zum besseren Verständnis:
In der Tabelle befinden sich Datensätze, in der Mitarbeiter ihre Stundenleistung pro Tag angeben. Diese Daten werden dann in einem .csv File gespeichert und in ein Warenwirtschaftsprogramm importiert. Das macht natürlich nur dann Sinn, wenn der betreffende Tag abgeschlossen ist.

Darum darf die Abfrage der Datensätze den aktuellen Tag nicht beinhalten. Also Systemzeit minus 1 Tag.

Habe im Internet nix gefunden, habt Ihr vielleicht eine Idee?
 
Hallo,

bei deiner Abfrage fehlt mir eine Kleinigkeit: Die Verbindung deiner Variablen mit dem Datenbankfeld:

Ohne PHP zu kennen schlage ich dir folgende Abfrage vor:

date('YYYYMMDD', strtotime('now -1 day'));
In der Variblen date sollte z. b. 20070417 stehen!

$abfrage="SELECT DISTINCT dat FROM r_abrechnung WHERE status = '1' AND dat = '$datum' ORDER BY 'dat' DESC";

So sollte die Datenbank alle Datensätze bereitstellen, die im Feld dat den Inhalt aufweisen, den du in deiner Variablen $datum gespeichert hast.
 
das mit AND dat=$datum funktioniert deshalb nicht, weil in diesem Feld nicht die aktuelle Systemzeit, sondern das Datum des Eintrages gespeichert ist.

Ich brauche aber in der Abfrage die Systemzeit - 1 Tag.

Ich weigere mich einfach zu glauben, dass das nicht zu bewerkstelligen ist.

Vielleicht habe ich im Code einen Bug drin, oder ich drücke mich nicht richtig aus.

Also versuche ich es jetzt nochmal (das Feld 'dat' ist vom Typ 'date' (2004-04-19)):
PHP:
<?php
$datum = date('Y-m-d', strtotime('now -1 day'));
	// Ausgabe Datum zur Kontrolle
	echo $datum."<br />";

	echo "<form action='./a_read.php' method='post'>";
	$abfrage="SELECT DISTINCT dat FROM r_abrechnung WHERE status='1' AND dat='$datum' ORDER BY 'dat' desc";
	$res = mysql_query($abfrage) or die (mysql_errno() . ": Keine Verbindung zu \"r_abrechnung\"! " . mysql_error());
?>
 
	<select name="zeitraumAnfang">
<?
	while ($ausgabe = mysql_fetch_array ($res)){
		echo '<option value="'.$ausgabe['dat'].'">'.$ausgabe['dat'].'</option>';
	}

?>

Bei dieser Abfrage bleibt das Dropdownfeld leer.

Das mit dem einen Tag weniger hat folgenden Hintergrund:
Die Datensätze dienen zur Abrechnung der Arbeitsstunden der Mitarbeiter. Man kann natürlich nur einen ganzen Tag abrechnen, deshalb muss die Abfrage Systemzeit - 1 Tag sein. Also macht das ja auch keinen Sinn, vom letzten Eintrag einen Tag abzuziehen. Man bedenke Feiertage oder Wochenenden. Man muss am Montag die Einträge vom Freitag abrechnen können, nicht erst am Dienstag. Aber die Einträge vom Montag erst am Dienstag.

Tja, that's it. Und nu?
 
Zuletzt bearbeitet:
Hallo,

Frage 1: Steht in $datum ein Wert mit dem Format YYYYMMDD?
Frage 2: Ist dein Datenbankfeld dat vom Typ date?
Wenn du beide Fragen mit Ja beantwortest, sollte die Abfrage laufen.
Zu deinem PHP Coding kann ich dir leider nichts sagen, weil ich kein PHP kann.

Zusatzinfo:

Wenn dein Feld dat vom Typ date ist (ohne Zeitkomponente) und keine Zeitkomponente beinhaltet, wäre eine Abfrage in SQL mit curdate() möglich. Dabei erhält man entweder den Inhalt
YYYY-MM-DD zurück, oder YYYYMMDD, wenn du in der Abfrage mit einer Konstanten arbeitest. Beispiel
Select curdate() -1 from dual liefert als Ergebnis 20070419, wenn du die Abfrage am 20.4.2007 startest. Die Umrechnung von YYYY-MM-DD in YYYYMMDD ist jedoch nicht das Problem.
Problematisch ist in mysql die Umrechnung vom Dezimalwert in echte Tage.
Beispiel: am 20070418 startest du die Abfrage: select curdate() -18 from dual
Ergebnis: 20070400 (erwarten würdest du aber 20070331)
Es ist in mysql scheinbar nicht möglich Taggenau zu arbeiten. In Oracle würdest du als Ergebnis 20070331 erhalten.

Wenn du in deiner Datenbank jedoch den Verarbeitungsstatus setzen würdest, könntest du mit dem Vergleichsoperator < arbeiten.
Was spricht dagegen?

Setzt du in deiner Datenbank den Verarbeitungsstatus auf ‘1’?
Wenn Ja, dann nimm doch folgende Abfrage:

$abfrage="SELECT DISTINCT dat FROM r_abrechnung WHERE status = '1' AND dat < curdate() ORDER BY 'dat' DESC";
 
Hallo,

sry, war leider die letzten Tage verhindert. Habe aber jetzt sehr viel aufzuholen, daher kann ich mich erst nächste Woche um dieses Problem kümmern.

Danke inzwischen, melde mich dann auf diesem Thread wieder.
 
Moin,
also Abfragen der oben gezeigten Art klicken evtl. Access-Nutzer zusammen... Sinnvoller ist wohl immer:

Wert aus der Tabelle explizit in einen sinnvollen Datumswert konvertieren, Mit Datediff die Differerenz zum aktuellen Datum bestimmen und als Vergleichkriterium nutzen.

cul,
Falk
 
Zurück