florian86
Goto Top

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...

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

Content-ID: 628266

Url: https://administrator.de/forum/sql-datum-uhrzeit-2-spalten-628266.html

Ausgedruckt am: 23.12.2024 um 16:12 Uhr

michi1983
michi1983 04.12.2020 aktualisiert um 21:18:51 Uhr
Goto Top
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
NSDM_E_MKPF
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:
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.
Florian86
Florian86 05.12.2020 um 07:31:33 Uhr
Goto Top
Hallo,

ich möchte mir eben alle Werte im Zeitraum

BUDAT = 03.12.2020 und CPUTM >= 230000 bis
BUDAT = 04.12.2020 und CPUTM <= 060000

Ich habe schon viele Sachen im SAP S4HANA abgefragt aber irgendwie noch nie Datum Uhrzeit aus 2 Spalten. Mit Timestamp isses ja kein Problem.

Arbeiten tu ich hier mit dem SAP eigenen SQL-Editor. Lass ich CPUTM weg und filtere nur das Datum bekomme ich meine Ergebnisse.
Ich möchte aber auch die Zeit noch abgrenzen.

select NSDM_V_MSEG.MBLNR,
       NSDM_V_MKPF.BUDAT,
       NSDM_V_MKPF.CPUTM
from SAPABAP1.NSDM_V_MSEG inner join SAPABAP1.NSDM_V_MKPF on NSDM_V_MSEG.MBLNR = NSDM_V_MKPF.MBLNR
where NSDM_V_MSEG.MATNR = 60256 and NSDM_V_MSEG.BWART = 101 and NSDM_V_MSEG.WERKS = '2000'  
and (cast(NSDM_V_MKPF.BUDAT as Datetime) = '03.12.2020' and NSDM_V_MKPF.CPUTM >= '230000') and (cast(NSDM_V_MKPF.BUDAT as Datetime) = '04.12.2020' and NSDM_V_MKPF.CPUTM <= '060000')  
Florian86
Florian86 05.12.2020 um 07:43:05 Uhr
Goto Top
Das funktioniert wie folgt ganz gut...

select NSDM_V_MSEG.MBLNR,
       NSDM_V_MKPF.BUDAT,
       NSDM_V_MKPF.CPUTM,
       NSDM_V_
from SAPABAP1.NSDM_V_MSEG inner join SAPABAP1.NSDM_V_MKPF on NSDM_V_MSEG.MBLNR = NSDM_V_MKPF.MBLNR
where NSDM_V_MSEG.MATNR = 60256 and NSDM_V_MSEG.BWART = 101 and NSDM_V_MSEG.WERKS = '2000'  
and cast(NSDM_V_MKPF.BUDAT as Datetime) = '03.12.2020' and NSDM_V_MKPF.CPUTM >= '230000'  

bringe ich aber ein 2. Datum ins spiel mit einer 2. Zeit hab ich keine Ergebnisse mehr
michi1983
michi1983 05.12.2020 um 09:57:25 Uhr
Goto Top
Zitat von @Florian86:
Arbeiten tu ich hier mit dem SAP eigenen SQL-Editor.
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
Florian86
Florian86 05.12.2020 um 11:17:09 Uhr
Goto Top
Ich ziehe mir die daten um diese in c# asp.net oder auch in vba in excel darzustellen.

Das funktioniert soweit super solange man weiß auf welche tabellen man zugreifen muss.

Nur jetzt der fall mit den 2 blöden spalten.

In der selektion im sap muss man ja auch erst über das buchungdatum gehen und erst nach der auswertung kann mann die zeit abgrenzen.

Das kann ich in vba oder c# auch nur wäre es schneller das direkt über die sql abfrage abzufangen
michi1983
michi1983 05.12.2020 um 13:16:38 Uhr
Goto Top
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
Florian86
Florian86 05.12.2020 um 14:32:51 Uhr
Goto Top
Ja die se16n ist mir bekannt aber wenn ich mir mehrere tabellen verknüpfe dann bringt mir das nix.
Und im excel habe ich mein ergebnis dann auf knopfdruck.

Über se16n schaue ich mir nur die einzelnen tabellen an wie ich am besten damit arbeite,
Im sql editor prüfe ich das ergebnis und wenn es passt baue ich mir die abfrage im vba oder c# ein.

Das mit concat werde ich probieren
BirdyB
BirdyB 05.12.2020 um 15:15:00 Uhr
Goto Top
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...
em-pie
em-pie 05.12.2020 aktualisiert um 15:24:34 Uhr
Goto Top
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
Florian86
Florian86 05.12.2020 um 15:32:01 Uhr
Goto Top
Ich weiß aber im excel das ganze anzusteuern auch für leute die keinen sap zugang haben bzw. Nicht dami arbeiten sollen funktioniert vba wunderbar
Florian86
Florian86 05.12.2020 um 15:33:38 Uhr
Goto Top
Danke für die info... das dachte ich mir schon
MadMax
Lösung MadMax 07.12.2020 um 16:12:16 Uhr
Goto Top
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:
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
Florian86
Florian86 08.12.2020 um 15:39:20 Uhr
Goto Top
Danke Max funktioniert super.

Aber Ohne Cast bekomme ich keine Werte und der User soll ja das Datum schon als Datumsformat eingeben, als muss ich das auch so casten.

kannst du mir das bitte noch genauer erklären.

Du sagst ja hier Datum 03.12.2020 und Zeit größer 230000 oder Datum größer 03.12.2020. Warum dieses oder?

((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')  
MadMax
Lösung MadMax 08.12.2020 aktualisiert um 18:04:41 Uhr
Goto Top
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