SQL Datum Uhrzeit 2 Spalten
Hallo Zusammen,
ich möchte aus einer SAP Datenbank über Datum und Zeit Daten abfragen.
Datum und Zeit sind aber in separaten Spalten.
probiert habe ich schon folgendes...
gibt es dazu eine Möglichkeit?
MfG
Florian86
ich möchte aus einer SAP Datenbank über Datum und Zeit Daten abfragen.
Datum und Zeit sind aber in separaten Spalten.
probiert habe ich schon folgendes...
where (cast(NSDM_V_MKPF.BUDAT as Datetime) = '03.12.2020' and NSDM_V_MKPF.CPUTM >= '230000') or (cast(NSDM_V_MKPF.BUDAT as Datetime) = '04.12.2020' and NSDM_V_MKPF.CPUTM <= '060000')
gibt es dazu eine Möglichkeit?
MfG
Florian86
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 628266
Url: https://administrator.de/contentid/628266
Ausgedruckt am: 19.11.2024 um 17:11 Uhr
14 Kommentare
Neuester Kommentar
Hallo,
du versuchst in deinem Beispiel auf eine View zu selektieren, das wird nicht klappen.
Dem Code entnehme ich, dass du dich im Eclipse bewegst, sprich mit CDS Views arbeitest.
Das Replacement Object der MKPF Tabelle lautet und da musst du eigentlich nicht vorher casten.
Du musst dich nur an das Datenelement halten mit welchem die beiden Felder definiert sind, nämlich DATS.
Du kannst direkt auf die Felder BUDAT und CPUTM abfragen in deinem Beispiel.
Hier ein Beispiel:
Was möchtest du denn mit deiner Abfrage eigentlich selektieren?
Für mich macht das OR nicht wirklich viel Sinn. Wenn du alle Datensätze haben möchtest, die zwischen 03.12.2020 23.00 Uhr und 04.12. 06.00 Uhr erstellt wurden, dann musst du mit einem UND arbeiten.
Gruß
michi
P.S: Bearbeite bei Gelegenheit den Titel des Threads. Das kann für viele verwirrend sein. Mit SQL hat das nur bedingt etwas zu tun.
du versuchst in deinem Beispiel auf eine View zu selektieren, das wird nicht klappen.
Dem Code entnehme ich, dass du dich im Eclipse bewegst, sprich mit CDS Views arbeitest.
Das Replacement Object der MKPF Tabelle lautet
NSDM_E_MKPF
Du musst dich nur an das Datenelement halten mit welchem die beiden Felder definiert sind, nämlich DATS.
Du kannst direkt auf die Felder BUDAT und CPUTM abfragen in deinem Beispiel.
Hier ein Beispiel:
where budat = '20170523' and cputm >= '100000' and cputm <= '103000'
Was möchtest du denn mit deiner Abfrage eigentlich selektieren?
Für mich macht das OR nicht wirklich viel Sinn. Wenn du alle Datensätze haben möchtest, die zwischen 03.12.2020 23.00 Uhr und 04.12. 06.00 Uhr erstellt wurden, dann musst du mit einem UND arbeiten.
Gruß
michi
P.S: Bearbeite bei Gelegenheit den Titel des Threads. Das kann für viele verwirrend sein. Mit SQL hat das nur bedingt etwas zu tun.
Das heißt über das DBACOCKPIT?
Das hatte ich noch nie genutzt weil die Daten dann ja nicht weiterverarbeiten kann.
Über eine CDS View klappt das ohne Probleme.
Darf ich blöd fragen warum du das genau mit dem SQL Editor machst? Was machst du mit der Erkenntnis der Daten?
Gruß
michi
Das hatte ich noch nie genutzt weil die Daten dann ja nicht weiterverarbeiten kann.
Über eine CDS View klappt das ohne Probleme.
Darf ich blöd fragen warum du das genau mit dem SQL Editor machst? Was machst du mit der Erkenntnis der Daten?
Gruß
michi
Genau deshalb fragte ich was du mit den Daten machen möchtest.
Ich sehe mehrere Wege.
1.) Nimm die SE16N Transaktion, da kannst du am einfachsten selektieren und dir die Daten dann als Excel direkt exportieren
2.) Müsste ich prüfen, in APAP und CDS geht es definitiv, den SQL Editor kenne ich zu wenig also keine Garantie: concateniere dir deinen Key und selektiere gegen den
Würde aber in deinem Beispiel definitiv über sie SE16N gehen.
Gruß
michi
Ich sehe mehrere Wege.
1.) Nimm die SE16N Transaktion, da kannst du am einfachsten selektieren und dir die Daten dann als Excel direkt exportieren
2.) Müsste ich prüfen, in APAP und CDS geht es definitiv, den SQL Editor kenne ich zu wenig also keine Garantie: concateniere dir deinen Key und selektiere gegen den
Würde aber in deinem Beispiel definitiv über sie SE16N gehen.
Gruß
michi
Zitat von @Florian86:
Ja die se16n ist mir bekannt aber wenn ich mir mehrere tabellen verknüpfe dann bringt mir das nix.
Zu dem Select habe ich gerade keine Idee, aber verknüpfte Daten kannst du wunderbar per SQVI in Excel bringen...Ja die se16n ist mir bekannt aber wenn ich mir mehrere tabellen verknüpfe dann bringt mir das nix.
Moin,
Vorweg: ich habe null Ahnung von SAP!
Deine Zeit oben sieht mit nach einem String im Format HHMMSS aus, egal ob hier 00:05 Uhr oder 15:25Uhr enthalten ist.
Die teuerste Variante wäre es doch, im SQL-Statement mit LEFT() und RIGHT() den String zu zerpflücken und mit CONCAT und ':' wieder zusammen zubauen.
Danach dein Datum und deine Zeit addieren (mit einem '+') und dann hättest du einen Timestamp.
Wie gesagt: kenne SAP nicht und schlage hier nur eine teure (im Sinne von Performance) Variante vor!
Edit:
Und wenn du dir das als UDF/ Funktion schreibst, kannst das in vielen anderen Abfragen immer wieder nutzen...
Gruß
em-pie
Vorweg: ich habe null Ahnung von SAP!
Deine Zeit oben sieht mit nach einem String im Format HHMMSS aus, egal ob hier 00:05 Uhr oder 15:25Uhr enthalten ist.
Die teuerste Variante wäre es doch, im SQL-Statement mit LEFT() und RIGHT() den String zu zerpflücken und mit CONCAT und ':' wieder zusammen zubauen.
Danach dein Datum und deine Zeit addieren (mit einem '+') und dann hättest du einen Timestamp.
Wie gesagt: kenne SAP nicht und schlage hier nur eine teure (im Sinne von Performance) Variante vor!
Edit:
Und wenn du dir das als UDF/ Funktion schreibst, kannst das in vielen anderen Abfragen immer wieder nutzen...
Gruß
em-pie
Hallo Florian,
ich sag es auch vorneweg: ich habe auch keine Ahnung von SAP, aber Dein Problem sieht mir nach einem gewöhnlichen Datenbankproblem aus.
Wie em-pie schon geschrieben hat, ist seine Lösung teuer, aber das spielt keine Rolle, wenn Du sowieso das "cast" beim Datum verwendest. Besser ist:
Und Du solltest zusehen, daß Du nicht NSDM_V_MKPF.BUDAT mit "cast" anpaßt, sondern das Datum, das Du suchst, in das richtige Format bringst. Ist bei Datenbanken immer besser.
Gruß, Mad Max
ich sag es auch vorneweg: ich habe auch keine Ahnung von SAP, aber Dein Problem sieht mir nach einem gewöhnlichen Datenbankproblem aus.
Wie em-pie schon geschrieben hat, ist seine Lösung teuer, aber das spielt keine Rolle, wenn Du sowieso das "cast" beim Datum verwendest. Besser ist:
where ((NSDM_V_MKPF.BUDAT = '03.12.2020' and NSDM_V_MKPF.CPUTM >= '230000') or NSDM_V_MKPF.BUDAT > '03.12.2020') and
((NSDM_V_MKPF.BUDAT = '04.12.2020' and NSDM_V_MKPF.CPUTM <= '060000') or NSDM_V_MKPF.BUDAT < '04.12.2020')
Und Du solltest zusehen, daß Du nicht NSDM_V_MKPF.BUDAT mit "cast" anpaßt, sondern das Datum, das Du suchst, in das richtige Format bringst. Ist bei Datenbanken immer besser.
Gruß, Mad Max
Hallo Florian,
die erste Zeile ist die untere Grenze für Deinen Bereich. Du willst alles haben, was entweder an Deinem ersten Tag nach 23 Uhr liegt oder komplett nach diesem ersten Tag.
Die zweite Zeile ist die obere Grenze des Bereichs. Du willst alles haben, was entweder an dem letzten Tag vor 6 Uhr liegt oder komplett vor dem letzten Tag.
Nochmal zum Cast:
Ich weiß nicht, in welcher Form das Datum in NSDM_V_MKPF.BUDAT vorliegt, wenn ich mir das Format von der Zeit anschaue, dann würde ich mal JJJJMMTT vermuten. Dann kannst Du das Vergleichsdatum auch in dieses Format bringen. Ich verwende da lieber Convert, da kann man mitgeben, welches Format für die Konvertierung verwendet werden soll.
Den Vergleich bekämst Du dann mit NSDM_V_MKPF.BUDAT = convert (char (8), convert (date, '03.12.2020', 104), 112), wenn es das Format ist, das ich oben vermutet habe. Ansonsten form es Dir mit Substring o.ä. zurecht.
Wenn Du nicht direkt mit dem Datentyp oder Format suchst, das Deine Datenbankspalte hat, kann kein Index genutzt werden und es müssen alle Datensätze konvertiert und durchsucht werden. Auch wenn kein Index vorhanden wäre, muß das Datum in allen Zeilen konvertiert werden. Wenn Du nur die rechte Seite anpaßt, dann ist das dieser eine String, der passend geformt wird und das wars. Alles konvertieren ist bei wenigen Daten vielleicht kein Problem, aber wenn es viele sind, hast Du keinen Spaß mehr.
Gruß, Mad Max
die erste Zeile ist die untere Grenze für Deinen Bereich. Du willst alles haben, was entweder an Deinem ersten Tag nach 23 Uhr liegt oder komplett nach diesem ersten Tag.
Die zweite Zeile ist die obere Grenze des Bereichs. Du willst alles haben, was entweder an dem letzten Tag vor 6 Uhr liegt oder komplett vor dem letzten Tag.
Nochmal zum Cast:
Ich weiß nicht, in welcher Form das Datum in NSDM_V_MKPF.BUDAT vorliegt, wenn ich mir das Format von der Zeit anschaue, dann würde ich mal JJJJMMTT vermuten. Dann kannst Du das Vergleichsdatum auch in dieses Format bringen. Ich verwende da lieber Convert, da kann man mitgeben, welches Format für die Konvertierung verwendet werden soll.
Den Vergleich bekämst Du dann mit NSDM_V_MKPF.BUDAT = convert (char (8), convert (date, '03.12.2020', 104), 112), wenn es das Format ist, das ich oben vermutet habe. Ansonsten form es Dir mit Substring o.ä. zurecht.
Wenn Du nicht direkt mit dem Datentyp oder Format suchst, das Deine Datenbankspalte hat, kann kein Index genutzt werden und es müssen alle Datensätze konvertiert und durchsucht werden. Auch wenn kein Index vorhanden wäre, muß das Datum in allen Zeilen konvertiert werden. Wenn Du nur die rechte Seite anpaßt, dann ist das dieser eine String, der passend geformt wird und das wars. Alles konvertieren ist bei wenigen Daten vielleicht kein Problem, aber wenn es viele sind, hast Du keinen Spaß mehr.
Gruß, Mad Max