PDA

View Full Version : sql und datum ....



ILEMax
10-07-20, 16:31
brauche ne abfrage auf <= morgen

habe

JJJJ 2020
MM 07
TT 10

current_date 10-07-20


(das solls mal werden)

Select * from datei where Date(jjjj*10000+mm*100+TT) <= (current_date+1 Day)

Die verschiedene Bsp hier im Forum funktionieren nicht
V7R3
Danke
Der ILEMax

B.Hauser
10-07-20, 19:00
Hier 2 Varianten, die funktionieren (vorausgesetzt JJJJ ist 4,0 und MM und DD sind 2,0 definiert):


Date(Digits(JJJJ) concat Digits(MM) concat Digits(TT) concat '000000')
Date(Right(Digits(JJJJ * 10000 + MM * 100 + TT) concat '000000', 14))

... und hier noch eine andere Variante (wenn Du mit Release 7.2 oder höher arbeitest:

Select ...
from ...
Where (JJJJ * 10000 + MM * 100 + TT) >= Dec(Current_Date + 1 Day, 8, 0);

Anstatt das Vergleichsdatum im SELECT-Statement zu berechnen, solltest Du an dieser Stelle besser eine Host-Variable mit dem berechneten Ergebnis verwenden.

Birgitta

andreaspr@aon.at
12-07-20, 22:03
Wenn man mag, kann man das ganze auch mit Regex machen:


Select ...
Where date(regexp_replace(varchar(JJJJ) || '-' || varchar(MM) || '-' || varchar(TT), '([0-9]+)-([0-9]+)-([0-9]+)', '$1-$2-$3')) <= current_date+1 Day


lg Andreas

B.Hauser
13-07-20, 06:11
Du solltest aber auch daran denken, dass bei den Regular Expressions alles in DBCLOBs konvertiert, was sich doch sehr negativ auf die Performance auswirken kann.
Ebenso sollte man auch die Double Pipe vermeiden (da nicht international!) und stattdessen CONCAT verwenden.

... es gibt natürlich noch einiige andere Möglichkeiten ein (numerisches) Datum zu konvertieren.

Birgitta

BenderD
13-07-20, 09:40
... wobei Lösungen mit date(Huddledatum) oder date(verhudelltes(Huddledatum)) tückisch sind, weil JJJJ und MM und TT und andere Huddledatumsvarianten kein gültiges Datum sein müssen (ich weiß: Bei uns sind die sauber, waren sie aber in > 95% der Fälle nicht!!!). Besser ist da schon eine Datumsdatei zum umsetzen aller benötigten Verhuddelungen (ist meist sogar schneller), die man zu joined (dafür sind Views da, am besten ist ein echtes Datumsfeld (kann auch für Huddle-Anwendungen zusätzlich und im LF/view weggelassen und mit Trigger gepflegt sein).
Statt der Rechnerei (10000* + 100 * +...)kann man das auch in die where clause packen )select ... where jjjjFeld < jjjjWert or (jjjjFeld = jjjjWert and mmFeld < mmWert) or (jjjjFeld = jjjjWert and mmFeld = mmWert and ttFeld <= ttWert), was für Optimizer und Query engine vorteilhaft sein könnte.

D*B

Fuerchau
13-07-20, 09:53
Oder, was wir auch schon bei Kunden eingesetzt haben, eine SQL-Function, die bei Fehlern dann NULL zurückgeben.

BenderD
13-07-20, 10:50
... Problem ist auch hier, dass der Optimizer nicht in die Funktion reinsehen kann. Was man hier nur tun kann, ist: die Funktion cachen lassen oder enstprechend kennzeichnen und nach Huddledatum sortieren. Will man das Resultset allerdings nach Kunde oder Artikel sortieren, geht das wieder nicht.

D*B

ILEMax
13-07-20, 14:08
@Birgitta
Deine 2. Variante funktioniert!
Hostvariable in einer Runsql Source kann ich nicht

Danke
Der ILEMax