Daten zwischen 2 Datumsangaben

Guten Tag Liebe SQL Freunde,

ich habe folgendes Problem:

Ich will eine Abfrage realisieren, in der ich Daten abrufe, die zwischen zwei verschiedenen Datumsangaben stehen.

Mit between löst man so etwas normalerweise, bei mir kommt aber noch zur abfrage dazu, das sie das Kriterium Ticket = Open auch erfüllen müssen.

Wenn ich jetzt aber die abfrage mache, kann ich meines wissens nur

SELECT * FROM Tickets WHERE datum BETWEEN ‘datum1’ AND ‘datum2’
anwenden. Daran noch ein AND Tickets = Open ranzuhängen scheint mir etwas komisch zu sein.

Wie kann ich dieses Problem lösen?

Schon mal vielen dank fürs nachdenken.

Liebe Grüße
proark

Dann überwinde Deinen Geschmack und mache es einfach, alternativ verwende Klammern.

Andreas

Ein paar verstreute Klammern helfen der Übersichtlichkeit und der Logik auf die Sprünge. Ganz genauso wie in der Mathematik.

Hm, gut zu wissen.

Dennoch habe ich ein Problem:

SELECT * FROM Tickets WHERE ‘LastAction’ BETWEEN ‘01.01.2008’ AND ‘28.09.2008’

In der Spalte LastAction stehen Werte wie:
08.08.2008 17:25:55
26.09.2008 13:04:49
12.09.2008 03:48:34

Auch wenn ich bei BETWEEN Daten angabe mit der Uhrzeit dran funktioniert es nicht.

Wenn ich die SQL-Abfrage ausführe, funktioniert sie zwar aber kein Datensatz wird angezeigt. Also kein Ergebnis auf die Abfrage.

Was ich komisch finde ist, dass ich das ‘LastAction’ in Einfache Anführungszeichen setzen musste, ansonsten wurde gemeckert:

Datentypen im Kriterien ausdruck unverträglich <<

Wo ist hier der Fehler?

Liebe Grüße
proark

Welchen Datentyp hat diese Spalte?

Schau ins Handbuch, wie Zeichenketten und Spaltennamen angegeben werden.

Andreas

String? LastAction ist bei mir ein Datum/Zeit Format!

Egal ob ich LastAction mit ’ oder " umschließe, bei beidem ein leeres Ergebnis.

Also das ist eine der üblen Schwächen von PG …

mit Quotes sind hier doppelte gemeint - weil PG grundsaetzlich case-sensitve arbeitet vererkennt er die spalte lastaction, LASTACTION oder LastAction als unterschiedlich.

Dazu kommt, dass PG alle symbole (tabellen, felder, etc) die nicht komplett klein geschrieben (definiert) sind in doppelten Quotes erwartet - scheiss Parser halt - alles in allem zeugt das von geringer disziplinierung der PG-Entwickler :wink:

also du musst “LastAction” verwenden … ‘LastAction’ ist ein String-Literal /-Konstante … die selbstverstaendlich nciht zwischen zwei datumsen liegen kann

Wenn Du schreibst "… where ‘A’ between ‘B’ and ‘C’, dann vergleichst Du den String ‘A’, ob dieser zwischen ‘B’ und ‘C’ liegt. Du willst aber den Inhalt der Spalte A mit ‘B’ und ‘C’ vergleichen. Also:

where "LastAction" between 'datum1'::date and 'datum2'::date and C

oder:

where LastAction between 'datum1'::date and 'datum2'::date and C

(falls Du noch eine Boolsche Spalte C hast, sowas schriebst Du ja.)

Andreas

Ok, vielen dank für eure Hilfe.

Hab noch 2 Sachen zu sagen:

Ich habe gemerkt, das ich nicht nicht gerade in dem für meine Fragen vorgeshenden Forum bin, denn bei mir geht es gar nicht um PostgreSQL, auch wenn PgSQL flächendeckend die SQL grundbefehle kennt (hab ich mich mal erkundigt).
Ich Dachte pg-forum ist einfach nur ein name, den sich das forum einfallen lassen hast :smiley:

Die zweite sache ist die Lösung:
SELECT *
FROM Tickets
WHERE (((LastAction) BETWEEN “08.01.2008” AND “16.09.2008”));

(War also nur ein Klammerproblem)

Vielen dank nochmal für eure Mühe! :slight_smile:

Liebe Grüße
proark

lach … YMMD :slight_smile:

ich hab gerade ne menge spass hier

Uff, irgendwie hab ich doch noch nicht die Lösung. Das klappt nicht so wie ich will :frowning:

Das Datum steht ja als DD.MM.YYY Format in der Spalte LastAction … der will mit dem between irgendwie nicht richtig arbeiten…

wenn ich es zum string konvertiere dann vergleich er die ersten beiden stellen vom datum… bringt mir aber nicht wirklich etwas.

(Arbeite mit VB.net auf ACCESS) <- is ja eig net so wichtig hauptsache SQL! ;D

Hat jemand eine Lösung?

Was verwendest Du?

Andreas

Was für ein Datentyp?

wenn ich es zum string konvertiere dann vergleich er die ersten beiden stellen vom datum… bringt mir aber nicht wirklich etwas.


test=*> create table proark (datum timestamptz, aktiv bool);
CREATE TABLE
test=*> insert into proark values(current_date, 't'::bool);
INSERT 0 1
test=*> insert into proark values(current_date+10, 't'::bool);
INSERT 0 1
test=*> insert into proark values(current_date+20, 'f'::bool);
INSERT 0 1
test=*> select * from proark where datum between '2008-09-01'::date and '2008-10-01'::date;
         datum          | aktiv
------------------------+-------
 2008-09-29 00:00:00+02 | t
(1 row)

test=*> select * from proark where datum between '2008-09-01'::date and '2008-11-01'::date;
         datum          | aktiv
------------------------+-------
 2008-09-29 00:00:00+02 | t
 2008-10-09 00:00:00+02 | t
 2008-10-19 00:00:00+02 | f
(3 rows)

test=*> select * from proark where datum between '2008-09-01'::date and '2008-11-01'::date and aktiv;
         datum          | aktiv
------------------------+-------
 2008-09-29 00:00:00+02 | t
 2008-10-09 00:00:00+02 | t
(2 rows)



(Arbeite mit VB.net auf ACCESS) ← is ja eig net so wichtig hauptsache SQL! ;D

Mein Beileid.

Hat jemand eine Lösung?

Vielleicht, aber mit Access bist Du ein ganzes Stück weit Offtopic hier.

Andreas

Ja, hab dann auch bemerkt, das ich hier net so ganz richtig bin, wills aber jetzt noch zu ende führen, wenn ich darf.

Datentyp ist Datum/Uhrzeit …

Select * FROM Tickets WHERE ((LastAction Between cdate(‘10.10.2007’) And cdate(‘01.01.2008’)) AND (Status = ‘Open’))

Durchs casten mit cdate, funtkioniert es jetzt.