Seite 1 von 1

[gelöst]Inhalte eines bestimmten alters

Verfasst: Mo, 18.08.2008 14:45
von DeeJay
Access Kriterium: Zwischen Datum()-365 Und Datum()

ergibt bei mir alle rechnungen aus den letzten 365 Tagen

ich hab nun schon mit CURDATE() DATE() , NOW() TODAY() und SUBDATE() versucht , aber stets fehler in der Syntax.
Base ist aber leider stets sparsam in den Fehlermeldungen und somit ist mir auch nicht begreiflich wo was zu ändern wäre.
MySQL Doku sagt aber leider auch nicht viel und alle Beispiele verlaufen auch im Sand

Re: Inhalte eines bestimmten alters

Verfasst: Mo, 18.08.2008 15:17
von komma4
Warum sagt Dir die Doku nichts?

MySQL Dokumentation

DATE_SUB(date,INTERVAL expr unit)


WHERE rechnung.datum > DATE_SUB( CURRENT_DATE , INTERVAL 365 DAY )

Re: Inhalte eines bestimmten alters

Verfasst: Mo, 18.08.2008 15:24
von DeeJay
SELECT `tbl_Rechnungen`.`Nettosumme` AS `Umsatz je Kunde`, `tbl_Rechnungen`.`LfdAdrNr`, `tbl_Adressen`.`Matchcode`
FROM `wzdb`.`tbl_Rechnungen` AS `tbl_Rechnungen`, `wzdb`.`tbl_Adressen` AS `tbl_Adressen`
WHERE `tbl_Rechnungen`.`LfdAdrNr` = `tbl_Adressen`.`LfdAdrNr` AND `tbl_Rechnungen`.`ReDatum` > DATE_SUB( CURRENT_DATE , INTERVAL 365 DAY )


wenn das so aussieht gehts nicht :/

sollte vllt dazu sagen das ich ne alte access db habe und die ganzen sachen jetzt neu in base zusammenklicke

EDIT:

SELECT `tbl_Rechnungen`.`Nettosumme` AS `Umsatz je Kunde`, `tbl_Rechnungen`.`LfdAdrNr`, `tbl_Adressen`.`Matchcode`
FROM `wzdb`.`tbl_Rechnungen` AS `tbl_Rechnungen`, `wzdb`.`tbl_Adressen` AS `tbl_Adressen`
WHERE `tbl_Rechnungen`.`LfdAdrNr` = `tbl_Adressen`.`LfdAdrNr` AND `tbl_Rechnungen`.`ReDatum` > ' DATE_SUB( CURRENT_DATE , INTERVAL 365 DAY )'

mit ' ' gehts :)

Re: Inhalte eines bestimmten alters

Verfasst: Mo, 18.08.2008 15:37
von DeeJay
ok muss mich korrigieren geht doch nicht :(

er gibt dann halt alles aus was an rechnungen in der db steht und nicht nur die aus dem letzten jahr

Re: Inhalte eines bestimmten alters

Verfasst: Di, 19.08.2008 07:11
von DeeJay
Ok also ich hab jetzt noch weiter probiert aber der gibt mir egal was ich tue nicht die Rechnungen
Zwischen Heute und vor einem Jahr aus :(


SELECT `tbl_Rechnungen`.`Nettosumme` AS `Umsatz je Kunde`, `tbl_Rechnungen`.`LfdAdrNr`, `tbl_Adressen`.`Matchcode` FROM `wzdb`.`tbl_Rechnungen` AS `tbl_Rechnungen`, `wzdb`.`tbl_Adressen` AS `tbl_Adressen` WHERE `tbl_Rechnungen`.`LfdAdrNr` = `tbl_Adressen`.`LfdAdrNr` AND `tbl_Rechnungen`.`ReDatum` > ' BETWEEN CURDATE -365 DAY AND CURDATE ' ORDER BY `tbl_Rechnungen`.`Nettosumme` DESC


habs nun auf diese abfrage geändert , es kommt keine fehlermeldung , aber auch die falsche ausgabe , es wird halt alles angezeigt und nicht das aus dem bestimmten zeitraum

Re: Inhalte eines bestimmten alters

Verfasst: Di, 19.08.2008 09:58
von komma4
DeeJay,

bin mir ziemlich sicher, dass die Anführungszeichen falsch sind, und die BETWEEN-Angabe ist syntaktisch auch nicht richtig.

Wenn ich heute mal etwas Zeit habe probiere ich es aus (habe zufällig 'nen MySQL-Server dabei)...

Re: Inhalte eines bestimmten alters

Verfasst: Di, 19.08.2008 12:05
von komma4
also, was hier geht ist bspw. die Abfrage:

Code: Alles auswählen

SELECT DATE_SUB( CURRENT_DATE,  INTERVAL 365 DAY  ) FROM rechnung


Der Vergleich mit einer als Datetime definierter Spalte funktioniert auch, also:

Code: Alles auswählen

... WHERE dt_created < DATE_SUB( CURRENT_DATE,  INTERVAL 180 DAY  )

Re: Inhalte eines bestimmten alters

Verfasst: Di, 19.08.2008 12:53
von DeeJay

Code: Alles auswählen

CREATE TABLE IF NOT EXISTS `tbl_Rechnungen` (
  `LfdReNr` int(11) default NULL,
  `LfdAdrNr` int(11) default NULL,
  `ReDatum` datetime default NULL,
  `Nettosumme` double default NULL,
  `EingangsDatum` datetime default NULL,
  `EingangsKontoauszug` varchar(50) collate latin1_german1_ci default NULL,
  `Mahnstufe` smallint(6) default NULL,
  `Bruttosumme` double default NULL,
  `Bemerkung` varchar(50) collate latin1_german1_ci default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;

Code: Alles auswählen

CREATE TABLE IF NOT EXISTS `tbl_Adressen` (
  `LfdAdrNr` int(11) default NULL,
  `Matchcode` varchar(20) collate latin1_german1_ci default NULL,
  `Firma1` varchar(50) collate latin1_german1_ci default NULL,
  `Postfach` varchar(8) collate latin1_german1_ci default NULL,
  `Strasse` varchar(40) collate latin1_german1_ci default NULL,
  `PLZPo` varchar(5) collate latin1_german1_ci default NULL,
  `PLZ` varchar(5) collate latin1_german1_ci default NULL,
  `Ort` varchar(40) collate latin1_german1_ci default NULL,
  `Land` varchar(5) collate latin1_german1_ci default NULL,
  `Branche` varchar(10) collate latin1_german1_ci default NULL,
  `KLASSIFIK` float default NULL,
  `VERTRETUNG` varchar(20) collate latin1_german1_ci default NULL,
  `Rabatt` float default NULL,
  `Firma2` varchar(50) collate latin1_german1_ci default NULL,
  `Kontaktzyklus` int(11) default NULL,
  `KontaktNeu` datetime default NULL,
  `Ursprung` varchar(20) collate latin1_german1_ci default NULL,
  `Zahlungen` int(11) default NULL,
  `Umsatzab94` float default NULL,
  `Waehrung` varchar(20) collate latin1_german1_ci default NULL,
  `GehoertZuAdresse` int(11) default NULL,
  `UeberlieferungErlaubt` bit(1) default NULL,
  `Poster` bit(1) default NULL,
  `Buchhaltung` varchar(15) collate latin1_german1_ci default NULL,
  `Lieferantennummer` varchar(20) collate latin1_german1_ci default NULL,
  `UStIDNr` varchar(20) collate latin1_german1_ci default NULL,
  `BeiAngebotenBeachten` longtext collate latin1_german1_ci,
  `BeiAuftraegenBeachten` longtext collate latin1_german1_ci,
  `Info` longtext collate latin1_german1_ci,
  `Homepage` varchar(50) collate latin1_german1_ci default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
mal etwas ausführlicher ... dies sind die 2 tabellen , diese sind über LfrAdrNr verknüpft

und dann soll das mit den rechnungen rauskommen ...
db1.jpg
db1.jpg (81.67 KiB) 870 mal betrachtet

Re: Inhalte eines bestimmten alters

Verfasst: Di, 19.08.2008 13:55
von komma4
was kommt denn raus, wenn Du die Einschränkung nach Zeit weg lässt:

Code: Alles auswählen

SELECT `tbl_Rechnungen`.`Nettosumme` AS `Umsatz je Kunde`, `tbl_Rechnungen`.`LfdAdrNr`, `tbl_Adressen`.`Matchcode`
FROM `wzdb`.`tbl_Rechnungen` AS `tbl_Rechnungen`, `wzdb`.`tbl_Adressen` AS `tbl_Adressen`
WHERE `tbl_Rechnungen`.`LfdAdrNr` = `tbl_Adressen`.`LfdAdrNr` 
Wenn diese Abfrage richtig formuliert ist müsstest Du ein Ergebnis bekommen.

und was, wenn die Einschränkung -ohne die Hochkomma- ergänzt wird:
[co

Code: Alles auswählen

ECT `tbl_Rechnungen`.`Nettosumme` AS `Umsatz je Kunde`, `tbl_Rechnungen`.`LfdAdrNr`, `tbl_Adressen`.`Matchcode`
FROM `wzdb`.`tbl_Rechnungen` AS `tbl_Rechnungen`, `wzdb`.`tbl_Adressen` AS `tbl_Adressen`
WHERE `tbl_Rechnungen`.`LfdAdrNr` = `tbl_Adressen`.`LfdAdrNr` AND `tbl_Rechnungen`.`ReDatum` >  DATE_SUB( CURRENT_DATE , INTERVAL 365 DAY )

Re: Inhalte eines bestimmten alters

Verfasst: Di, 19.08.2008 13:59
von DeeJay
der 1. von beiden codes geht , aber es ergibt sich das selbe wie vorher , er zeigt alles
der 2. code sagt syntax fehler

Re: Inhalte eines bestimmten alters

Verfasst: Di, 19.08.2008 14:18
von komma4
Tja, würde mal sagen: Pech gehabt ( => könnte ein Ticket sein ).


In StarBasic geht die Abfrage - auch unter Nutzung der Date_Sub()-Funktion.
Im Abfrage-Designer erhalte ich auch:

Code: Alles auswählen

SQL-Status: HY000
Fehler-Code: 1000

syntax error, unexpected $end, expecting BETWEEN or IN or SQL_TOKEN_LIKE

Das könnte auch der Treiber (hier: JDBC) sein, der es nicht zulässt.

Re: Inhalte eines bestimmten alters

Verfasst: Di, 19.08.2008 14:26
von DeeJay
ok ich nutze odbc bzw unixodbc zum verbinden

und nur um es zu verstehen
es ist nen bug/ nicht möglich /absoluter denkfehler?

immerhin läuft die alte "Datenbank" unter Access 97 hier

Re: Inhalte eines bestimmten alters

Verfasst: Di, 19.08.2008 15:43
von komma4
Aktiviere mal in der SQL-Ansicht unter Bearbeiten>SQL-Kommando direkt ausführen!

(der Schalter war hier mal eingestellt - weiss der Kuckuck, warum der weg war.

Damit klappt die Abfrage hier (JDBC):

Code: Alles auswählen

 WHERE `rechnung`.`datum` > DATE_SUB( CURRENT_DATE, INTERVAL 365 DAY) 

War es der Schalter?

Re: Inhalte eines bestimmten alters

Verfasst: Di, 19.08.2008 16:19
von DeeJay
juhu

Code: Alles auswählen

SELECT `tbl_Rechnungen`.`Nettosumme` AS `Umsatz je Kunde`, `tbl_Rechnungen`.`LfdAdrNr`, `tbl_Adressen`.`Matchcode`
FROM `wzdb`.`tbl_Rechnungen` AS `tbl_Rechnungen`, `wzdb`.`tbl_Adressen` AS `tbl_Adressen` 
WHERE `tbl_Rechnungen`.`LfdAdrNr` = `tbl_Adressen`.`LfdAdrNr` AND `tbl_Rechnungen`.`ReDatum` > DATE_SUB( CURRENT_DATE, INTERVAL 365 DAY)  ORDER BY `tbl_Rechnungen`.`Nettosumme` DESC
so tut es :)

wobei ich das vermutlich das SQL ausführen wohl der einzigste fehler war *hmpf*