php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.07.2011, 11:28  
noop
Gast
 
Beiträge: n/a
Standard [Erledigt] Abfrage mittels date_format

Hi,

ich brauch mal jm. zum Brainstroming.

In der DB habe ich ein Feld, was ein komplette Datum beinhaltet.
Z.b. 2009-03-03 20:32:20

Mittels SELECT DATE_FORMAT(datum, '%d.%m.%Y') as datum FROM `logs`");
hab ich es nun schon mal soweit gekürzt, das nur noch der Tag,Monat,Jahr rauskommt.

Vlt. erstmal das Ziel erklären.
Ich möchte alle Datensätze von den letzten 3 Monaten erhalten.

Ich habe hier 3 Ansatzmöglichkeiten.

1: Abfrage aller Datensätze und mittels foreach-Schleife gemächlich alle durchgehen. Datum in timestamp umwandeln und diesen dann entsprechend berechnen lassen (ob DB-Satz noch innerhalb der 3 Monate liegt; ansonsten verwerfen). (bekomm ich alleine hin. Ist nur sehr lastig, da nur ca. 10% der Daten benötigt werden)

2: SQL-Statment so erweitern, das nur die 3 Monate angezeigt werden.
Code:
SELECT DATE_FORMAT(datum, '%d.%m.%Y') as datum FROM `logs` WHERE DATE_FORMAT(datum, '%d.%m.%Y') >= '01.04.2011'
Nur leider ist der Output nicht korrekt. Ich bekomme massig Daten zurück. Bis ins Jahre 2009 zurück.
Somit scheint ein direkter Vergleich so wie ich ihn jetzt geschrieben habe nicht möglich.

Was mich unweigerlich zu einer Frage führt. Kann ich ein Datum schon in der Abfrage in ein Timestamp format umwandeln, sodass ich das dann in der WHERE klausel die entsprechenden bedingungen setzen kann. Mit ist leider nur FROM_UNIXTIME bekannt, der ja genau das gegenteil macht.


Oder hat gar einer ein anderen Lösungsvorschlag ?
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.07.2011, 12:11  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

das Date_format macht aus deinem DateTime-Feld der Datenbank einen String (Zeichenkette) und wenn du die mit einer anderen Zeichenkette ('01.04.2011') vergleichst, dann geht mysql da nach Wörterbuch vor (und da wäre dann auch der 31.03. größer, weil er von links nach rechts die Zeichen vergleicht) -

damit hast du 2 Möglichkeiten

1)
du vergleichst OHne DateFormat - und mit amerikanisch formatiertem Vergleichsdatum
Code:
WHERE datum>= '2011-04-01'
ODER 2)
noch besser - du nimmst die Datum/Zeitformeln der Datenbank
Code:
WHERE DATE_SUB(CURDATE(),INTERVAL 3 Month) <= datum
DATE_SUB(CURDATE();INTERVAL 3 Month) -> aktuelles Datum minus 3 Monate ... und liefere alle Einträge wo deine Datumspalte größer gleich diesem Datum ist

im übrigen halte ich es für ungünstig, dass du deine DateFormat umgewandelte Datum-Spalte genau so benennst, wie die ursprüngliche DatumSpalte .... das schreit nach "ambiguous"Fehlermeldungen
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 27.07.2011, 12:26  
noop
Gast
 
Beiträge: n/a
Standard

ja super... Pos.2 haut hin. Vielen Dank hierfür.

Seit gestern hab ich aber noch ein anderen Problem.
Ich hab in der DB ein Feld, was ein Preis beinhaltet.
Das Feld selbst ist auf float, wo ich mit php schön rechnen kann.

Wenn ich aber die summe aus den 3 Monaten gewinnen will, fliegt SQL au die nase, da SQL ja ein , erwartet statts einen punkt.

Nun werkel ich schon bei convert rum. aber das scheint auch nicht die lösung zu sein.

Code:
SELECT SUM(`brutto`), datum from log WHERE DATE_SUB(CURDATE(),INTERVAL 3 Month) <= datum
brutto hat 2 zeilen á: 26.99 und 16.95. SQL rechnet sich hier angebliche 43,94 aus. tatsächlich sollten es aber 46,94 sein.

Gibt es dafür auch Lösungswege ?
  Mit Zitat antworten
Alt 27.07.2011, 13:28  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

also dein Mathelehrer rotiert gerade im Grab ... 26.99+16.95 -> 26+16=42 + 1+.94 -> 43.94 [ Oder anders herum .. 27 + 17 = 44 - 6 Cent = 43.94 ] stimmt auffallend, was die Datenbank berechnet .... vielleicht übst du das nochmal mit dem Taschenrechner

als allgemeiner Tipp dazu würde ich dir empfehlen ...

stelle die Felder um - persönlich würde ich dir wegen eventueller Rundungsfehler (unsere angenehmen Dezimalzahlen lassen sich im Binärsystem nicht gut darstellen) verwende ein Integer und speichere die Preise mit dem Faktor 100 (also nicht in Euro sondern in Cent)

damit hast du kein Problem mehr mit Dezimalpunkt / Dezimalkomma , PHP kann die Werte einwandfrei importieren - und rechnen kann deine Datenbank auch damit - bei unsigned int sogar für Preise bis 42,9 Million Euro- php-seitig musst du dann nur noch durch 100 teilen und hast wunderbar Euro und Cent ^^
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

Geändert von eagle275 (27.07.2011 um 13:32 Uhr).
eagle275 ist offline   Mit Zitat antworten
Alt 27.07.2011, 14:25  
noop
Gast
 
Beiträge: n/a
Standard

achherje... was hab ich denn da gerechnet. Du hast natürlich recht. Ich glaub ich war im falschen Monat. Dann sind ja die werte, die mir schon seit gestern angezeigt werden ja doch korrekt.

Nunjut. Auch wenn es nun langsam den Eindruck erweckt, das ich mir alles vorkauen lasse.... was nicht korrekt ist:

Was haut denn hier nicht hin.
Ich brauche die Summe von der Spalte brutto. Aber nur was im letzten Monat generiert worden ist.

Code:
SELECT SUM(brutto) 
from auftrag 
WHERE datum
BETWEEN DATE_SUB(CURDATE(),INTERVAL 1 Month)
AND WHERE DATE_SUB(CURDATE(),INTERVAL 2 Month)
SQL is damit aber nicht wirklick glücklich:
Zitat:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE DATE_SUB(CURDATE(),INTERVAL 2 Month)' at line 6
  Mit Zitat antworten
Alt 27.07.2011, 14:30  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

nur 1 Where ist erlaubt

also ich würd das umbauen zu

Code:
WHERE
DATE_SUB(CURDATE(),INTERVAL 2 Month) <= datum  AND 
datum <= DATE_SUB(CURDATE(),INTERVAL 1 Month)
- ungetestet ...
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 27.07.2011, 14:39  
noop
Gast
 
Beiträge: n/a
Standard

Danke dir. Is getestet und SQL hats bestätigt.

Vielen Dank
  Mit Zitat antworten
Alt 05.08.2011, 15:05  
noop
Gast
 
Beiträge: n/a
Standard

Müste es nochmal hochholen, da ich grad mit ein paar Beispiel-Datensätze arbeite und mir dabei eine Fehlerhafte ausgabe aufgefallen ist.

Code:
$umsatz_aktueller_monat		= CFG::sqlCount("SELECT SUM(brutto) from auftrag WHERE DATE_SUB(CURDATE(),INTERVAL 1 Month) <= datum");
Hier wird mir genau ein Monat angezeigt. Also genau das, was der Befehl macht.
Allerdings brauch ich nicht den ein Monatsinterval sondern tatsächlich nur den aktuellen Monat. Soweit ich das erlesen konnte (oder auch nicht... habe darüber nichts gefunden) kann das interval nicht.

Sprich: Gebe mir die Summe vom 01.08 - 05.08 aus.
Eine Lösung wäre, wenn ich per PHP berechne, wieviel Tage bereits vom aktuellen Monat vergangen sind und übergebe das im SQL Statement.

Aber vllt. hat ja noch jm. ne andere Lösung (?)
  Mit Zitat antworten
Alt 05.08.2011, 15:21  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Nur Jahr und Monat vergleichen, und den Tag weglassen.
Stichwort Datumsfunktionen.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mittels Abfrage des Hostheaders auf Seiten verzeigen FritzS PHP Einsteiger 11 08.03.2011 07:50
Abfrage von einer Abfrage Datenbanken 5 27.01.2011 23:31
Problem mit Abfrage - join, inner join, distinct? Gachet01 Datenbanken 2 27.01.2011 06:49
False Abfrage und SQL hängt sich auf marc77 Datenbanken 4 22.11.2010 14:57
[Erledigt] Active User Logging (mittels XMLHttpRequest angestoßen) Matthias N. Software-Design 5 01.11.2010 10:30
Abfrage mit LIKE und Abfrage mit MATCH??? bench78 PHP Tipps 2010 20 28.04.2010 23:05
result Variablen von SQL verbinden vci PHP Tipps 2010 15 05.02.2010 19:09
Scriptsuche [Erledigt] SQL- Abfrage über 2 tabellen ejim Scriptbörse 1 17.07.2009 21:10
SQL Abfrage ohne DESC langsam Thisi Datenbanken 5 07.01.2009 09:53
Wiemache ich eine Abfrage über 3 Tabellen??? djscaleo Datenbanken 8 05.01.2009 10:46
[Erledigt] IF() abfrage in variable packen PHP Tipps 2005 14 01.04.2005 17:23
Abfrage von Char-Feldern Datenbanken 9 04.02.2005 14:06
[Erledigt] Mysql Abfrage Problem! PHP-Fortgeschrittene 5 27.11.2004 10:22
Shoutcast server abfrage mittels ein http header request PHP Tipps 2004 0 30.10.2004 18:05
Abfrage aus DB noch mal ausgeben und Abfrage aus mehrern Tab PHP Tipps 2004 4 12.07.2004 15:00

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
date_format php, php:abfrage date_format, date_format deutscher monat, aus timestampsplate nur tag abfragen, php sql wieviel tage letzter monat, date_format minus einen tag, sql date_format, deutsches datum in foreach schleife umwandeln php, datum in foreach schleife umwandeln php, date_format php abfrage, mysql abfrage where und date_format, wÖrterbuch curdate, curdate wÖrterbuch, from_unixtime gegenteil, date_format monat vergleichen sql, date_format umwandeln, date_format vergleicht nicht richtig, sql date_format euro, date_format letzen jahr, where date_format

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:19 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum