Problem mit Filtern nach Zeit

itsme87

Neuer Benutzer
Beiträge
4
Hallo zusammen,

ich bin neu im Datenbank-Geschäft und habe gleich eine Frage:

Code:
select trackid, Start_TIME, STOP_TIME from MOBILETRACK.tracks where user_id = 1322796034 and Start_TIME between '7.12.11' and  '14.12.2011' order by Start_TIME

Damit lese ich alle Einträge aus der Tabelle Mobiletrack mit den gesetzten Bedingungen aus. Allerdings ist das letzte ausgelesene Datum der 13.12. und nicht der 14.12.
Ich habe versucht das Datum mit "DateAdd" zu ändern, aber kein Erfolg. Wie würde das funktionieren?
Einfach als Enddatum den nächsten Tag eingeben ist keine Option, da ich über eine Matlab-Gui die Daten downloade und der User die Daten von Hand eingibt. Natürlich wäre es möglich, das Datum in Matlab anzupassen aber da gibt es doch bestimmt eine einfachere Lösung mit einem direkten SQL-Befehl.

Danke schonmal für eure Hilfe :)
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
Hallo zusammen,

ich bin neu im Datenbank-Geschäft und habe gleich eine Frage:

Code:
select trackid, Start_TIME, STOP_TIME from MOBILETRACK.tracks where user_id = 1322796034 and Start_TIME between '7.12.11' and  '14.12.2011' order by Start_TIME

Damit lese ich alle Einträge aus der Tabelle Mobiletrack mit den gesetzten Bedingungen aus. Allerdings ist das letzte ausgelesene Datum der 13.12. und nicht der 14.12.
Ich habe versucht das Datum mit "DateAdd" zu ändern, aber kein Erfolg. Wie würde das funktionieren?
Einfach als Enddatum den nächsten Tag eingeben ist keine Option, da ich über eine Matlab-Gui die Daten downloade und der User die Daten von Hand eingibt. Natürlich wäre es möglich, das Datum in Matlab anzupassen aber da gibt es doch bestimmt eine einfachere Lösung mit einem direkten SQL-Befehl.

Danke schonmal für eure Hilfe :)


vielleicht aus dem between ein Vergleich auf größer bzw. kleiner / gleich Endzeitpunkt machen. Du kannst auch in der Abrage selbst aus dem Enddatum ein Enddatum+1 machen, was genau hindert dich dran?


In PG würde ich RANGE nehmen ...
 

ukulele

Datenbank-Guru
Beiträge
4.394
Code:
SELECT    trackid,
        Start_TIME,
        dateadd(day,1,STOP_TIME) AS Stop_TIME
FROM    MOBILETRACK.tracks
WHERE    user_id = 1322796034
AND        Start_TIME BETWEEN '07.12.2011' AND '14.12.2011'
ORDER BY Start_TIME
Du solltest auf jedenfall darauf achten das deine Datumsangaben bei BETWEEN richtig von der DB interpretiert werden (vor allem Tag und Monat).
Bei der Ausgabe kannst du problemlos einen Tag addieren, oder suchst du eine bestimmte Uhrzeit am selben Tag (z.B. 2011-12-14 00:00:00.000)?
 

itsme87

Neuer Benutzer
Beiträge
4
Danke schonmal.

Ich suche keine bestimmte Uhrzeit, einfach alle Daten von Start- bis Enddatum.
Wie kann ich denn einen Tag dazuzählen? Meint ihr so:
Code:
between '7.12.11' and  '14.12.11 +1'
Da bekomme ich immer noch die gleichen Ergebnisse bis zum 13.12.

Wie kann ich denn überprüfen wie die Datenbank das Datum interpretiert?
Sollte aber stimmen. Wenn ich das Start-Datum ändere fangen die ausgewählten Daten am neuen Start-Datum an.
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Danke schonmal.

Ich suche keine bestimmte Uhrzeit, einfach alle Daten von Start- bis Enddatum.
Wie kann ich denn einen Tag dazuzählen? Meint ihr so:
Code:
between '7.12.11' and  '14.12.11 +1'
Da bekomme ich immer noch die gleichen Ergebnisse bis zum 13.12.

irgendwie so:

Code:
test=*> select current_date + 1;
  ?column?
------------
2013-11-13
(1 row)

test=*> select '2013-11-12'::date + '1day'::interval;
      ?column?
---------------------
2013-11-13 00:00:00
(1 row)

Mag sein, daß die Syntax unter Oraggle anders ist.

Wie kann ich denn überprüfen wie die Datenbank das Datum interpretiert?
Sollte aber stimmen. Wenn ich das Start-Datum ändere fangen die ausgewählten Daten am neuen Start-Datum an.

Idealerweise mit to_date() oder so arbeiten oder via CAST (wie oben) der DB sagen, daß es ein DATE ist. Aber vermutlich paßt das bei Dir.
 

gurbelunder

Datenbank-Guru
Beiträge
136
Was akretschmar am Anfang meinte, wäre dies hier, sollte auch funktionieren. Sieht aber nicht ganz so schön aus:

Code:
SELECT trackid, Start_TIME, dateadd(day,1,STOP_TIME) AS Stop_TIME 
FROM MOBILETRACK.tracks 
WHERE user_id = 1322796034 AND Start_TIME >= '07.12.2011' AND Start_TIME <= '14.12.2011' 
ORDER BY Start_TIME
 

itsme87

Neuer Benutzer
Beiträge
4
Ich habs gerade probiert und folgende Meldung bekommen:
"DATEADD": ungültiger Bezeichner
Kann es sein dass Oracle diesen Befehl nicht unterstützt? Wobei er in der Hilfefunktion existiert. Da wird man auf diesen Link verwiesen
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Ich habs gerade probiert und folgende Meldung bekommen:
"DATEADD": ungültiger Bezeichner
Kann es sein dass Oracle diesen Befehl nicht unterstützt? Wobei er in der Hilfefunktion existiert. Da wird man auf diesen Link verwiesen

Da keiner hier weiß, was du genau gemacht hast, wird es schwer, das zu beurteilen.
 

gurbelunder

Datenbank-Guru
Beiträge
136
Okay, der DATEADD Fehler kam von mir, ich habe die Anweisung anders übernommen.

Rein praktisch sollte es so ausreichen:

Code:
select trackid, Start_TIME, STOP_TIME 
from MOBILETRACK.tracks 
where user_id = 1322796034 and Start_TIME >= '7.12.11' and Start_TIME <=  '14.12.2011' order by Start_TIME

Bezüglich DATEADD: den Fehler habe ich übernommen aus einem anderen Post. Solltest du hieran Interesse haben, dann schaue dir auch bitte die genaue Syntax dazu an.
 

ukulele

Datenbank-Guru
Beiträge
4.394
dateadd() hab ich jetzt in MSSQL verwendet, sollte aber sehr ähnlich auch unter Oracle laufen. Funktionsnamen unterscheiden sich bei SQL sehr häufig aber tun meist das selbe.

Dein Problem, alle Datensätze wo Wert x innerhalb eines Zeitraums liegt, ist mit BETWEEN zu lösen.
Code:
DECLARE    @Start_TIME DATETIME

SET        @Start_TIME = '2011-14-12 00:00:00.000'

IF        @Start_TIME BETWEEN '7.12.11' AND '14.12.2011'
BEGIN
    SELECT    1
END
ELSE
BEGIN
    SELECT    2
END
-- Ergebnis 1
 
Werbung:

itsme87

Neuer Benutzer
Beiträge
4
Danke für eure Hilfe,
ich habe es nach einigen Versuchen trotzdem nicht hinbekommen und es jetzt mit ein paar if-Abfragen in Matlab umgesetzt bevor ich noch mehr Zeit verliere.
 
Oben