In der SQL Query mit Datum rechnen

Sentinel997

Benutzer
Beiträge
11
Hallo Zusammen,

Gerne würde ich automatisiert mit einem scheduler jeden Montag die Belege der letzten sieben Tage aufgelistet haben.
Mit der untenstehende Abfrage habe ich es soweit gebracht, dass mir alle Daten aufgelistet werden.
Nun bekomme ich aber es nicht hin, dass mir nur die letzten sieben Tage (Stichtag ist jeweils der aktuelle Tag) aufgelistet werden.
Das Datum erhalte ich aus der SQL Datenbank als .1658599348005.png(siehe das Format unten in der Tabelle)
Damit es nach einem Datum aussieht habe ich es mit Substring umgestellt.
Hat mir jemand einen Ansatz, damit ich folgendes hinbekomme.

ab aktuellem (HEUTE) Tag alle die Belege auflisten die K3G5DT MINUS sieben Tage sind.

Vielen Dank


1658599679931.png

SELECT
K3G5DT,
SUBSTRING(cast(K3G5DT AS char),6,2) + '.' +
SUBSTRING(cast(K3G5DT AS char),4,2) + '.' +
SUBSTRING(cast(K3G5DT AS char),2,2) AS 'Belegs-Datum',
K3BFCD,
K3DECD,
K3DOTY,
K3V7VA,
K3V1VA

FROM tbl_rrk3cpp

WHERE K3ZRCE = 01 AND
K3M9CE = 'BCH' AND
K3DECD > 100000

ORDER BY K3BFCD
 

Anhänge

  • 1658599121450.png
    1658599121450.png
    13,5 KB · Aufrufe: 0
  • 1658599339951.png
    1658599339951.png
    3,6 KB · Aufrufe: 0
Werbung:
Wenn Du ein Datum speicherst, dann verwende dazu auch den passenden Datentyp. Damit kann man dann auch rechnen, z.B. im WHERE und dann vergleichen, ob das Datum innerhalb der letzten 7 Tage von aktuellen Datum liegt.
 
Auf die Speicherung des Datum in der Datenbank habe ich keinen Einfluss. Dieses Einträge werden von unserem DMS gemacht.
Habe ich evtl. die Möglichkeit bei der Umstellung mit dem Substring den Wert als Datum abzulegen und anschliessend mit diesem zu rechnen?
 
Damit kannst Du vielleicht was anfangen:
Code:
select getdate(),  
datepart(yy, getdate() ) year, 
datepart(month, getdate() ) month,  
datepart(day, getdate() ) day,

datepart(yy, getdate()-7 ) year7, 
datepart(month, getdate()-7 ) month7,  
datepart(day, getdate()-7 ) day7,

datepart(yy, getdate()-209 ) year209, 
datepart(month, getdate()-209 ) month209,  
datepart(day, getdate()-209 ) day209
;
 
Das habe ich bereits einmal in einer älteren Abfrage gemacht im WEHRE. Das hat dann so ausgesehen.

1658600440094.png
Da habe ich aber mit den SYSDATETIME gearbeitet.
Und da hatte ich in der Datenbank jeweils das Jahr und den Monat einzeln. Jetzt habe ich ein komplettes Datum und ich bekomme das nicht hin.

Was gäbe es denn noch für eine Elegantere Lösung ausser das ich das DMS umprogrammieren lassen müsste. :)
 
Naja, Du willst das nicht zerlegen, vermutlich, Du willst einen Wert "bauen" der analog zu Deinem vorhandenen, kaputten Datum formatiert ist und dabei 7 Tage abziehen oder?
 
Ich möchte alle Belege aufgelistet haben der letzten sieben Tage. Und es soll vom heutigen Datum gerechnet werden.
Also noch konkreter, kommst Du damit klar?
Code:
select getdate(),
Concat('1',right(datepart(yy, getdate()-7), 2 ) , 
FORMAT(datepart(month, getdate()-7 ), '00') ,  
FORMAT(datepart(day, getdate()-7), '00')) SpezialDatumMinus7

Ich gehe davon aus, dass Dein seltsames Datum eine zentrale Rolle spielt und (hoffentlich) indiziert ist. Deswegen willst Du diesen Wert nicht zerlegen, sondern nur benutzen. Die Datumsakrobatik machst Du separat.
 
Das "Datumsformat" ist aber mal richtig gruselig in jeder Hinsicht. Die 1 am Anfang kann eigentlich nur für das Jahr 2000 stehen, 1900 müsste dann 0 und 2100 2 sein, dein DMS kann also nur noch Dokumente bis 2899 abbilden...

Du kannst a) das Spaltenformat umbauen zu einem echten Datum und dann mit Datumsfunktionen arbeiten oder b) ein echtes Datum umbauen damit es mit deinem Datum vergleichbar ist. @dabadepdu hat zurecht angemerkt das eventuell ein Index auf der Spalte liegt, dann wäre Option a) eventuell langsamer. Hier mal ein Beispiel für eine Konvertierung a) des Datum aus der Tabelle und b) des aktuellen Datums - 7 Tage:
Code:
SELECT    convert(DATE,convert(VARCHAR(10),
        1900 + convert(INT,substring(convert(CHAR(7),K3G5DT),1,1)) * 100 +
        convert(INT,substring(convert(CHAR(7),K3G5DT),2,2))
        ) + '-' +
        substring(convert(CHAR(7),K3G5DT),4,2) + '-' +
        substring(convert(CHAR(7),K3G5DT),6,2)) AS datum_aus_tabelle_konvertiert,
        convert(VARCHAR(7),(datepart(year,dateadd(day,-7,getdate())) - 1900) / 100) +
        substring(convert(CHAR(4),datepart(year,dateadd(day,-7,getdate()))),3,2) +
        right('0' + convert(VARCHAR(2),datepart(month,dateadd(day,-7,getdate()))),2) +
        right('0' + convert(VARCHAR(2),datepart(day,dateadd(day,-7,getdate()))),2) AS aktuelles_datum_minus7tage_konvertiert
FROM    tabelle
Damit kannst du vergleichen.
 
Ist denn das Belegdatum nicht ein Datumstyp und kann sich K3G5DT von Belegdatum unterscheiden? Ansonsten müßtest Du dir eine Stored Procedure schreiben, die den Spaltenwert K3G5DT in einen Wert vom Typ Datetime umwandelt. Dann kannste damit deine Abfrage auch gscheit machen.
 
K3G5DT ist gem. Post #1 vom Typ DECIMAL(7,0) und 1220602 entspricht 02.06.2022.

Die Zerlegung habe ich in meinem Select demonstriert, genauso den umgekehrten Weg das aktuelle Datum in diese Form zu bringen. Natürlich macht es Sinn beide Vorgänge in SPs auszulagern das ändert aber erstmal nicht viel an der Sache.
 
Werbung:
Hallo Zusammen
Ich konnte mich endlich wieder der Sache annehmen. Und vielen Dank an alle.
Zuerst musste ich die Datenanbindung umbauen, damit ich nicht wie ODBC sondern direkt über den SQL Server die Abfragen durchführen konnte.
Das hat mich doch einige Stunden gekostet.
Jetzt konnte ich mit dem code von dabadepdu und ukulele das Problem lösen.
Danke nochmals an alle.
 
Zurück
Oben