8.1k Aufrufe
Gefragt in Datenbanken von deluxestyle Mitglied (901 Punkte)
Wie kann ich den fünften Werktag eines Montas per SQL ermitteln?
Feiertage mal rauslassen...

Ich möchte per SQL ermitteln, ob das aktuelle Datum der fünfte Werkttag des Montas ist.

Danke für eure Hilfe

8 Antworten

0 Punkte
Beantwortet von teerbaby Mitglied (525 Punkte)
Was hat das Ganze mit einer Datenbankabfrage zu tun? Kannst du die mal grob formulieren?
0 Punkte
Beantwortet von deluxestyle Mitglied (901 Punkte)
ich brauche eine SQL Abfrage oder Procdure die mir true oder1 zurück liefert, falls sich das aktuelle Datum (sysdate) um den 5. Werktag eines Monates handelt
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo,

mit der Voraussetzung deine Tabelle heisst "tblDatum" und das Datumsfeld "Datum", dann liefert die folgende Abfrage True/False bzw. -1/0 für dein Problem:

SELECT
DateAdd("d",
7-IIf(
Format(CDate("01." & Format([Datum],"mm.yyyy")),"w",1)<=2,
Format(CDate("01." & Format([Datum],"mm.yyyy")),"w",1),
-1),
CDate("01." & Format([Datum],"mm.yyyy"))
)=[Datum] AS istFuefterWerktag, tblDatum.Datum
FROM tblDatum;

Warum? Die Format-Funktion liefert den Wochentag, 1 für Sonntag, 2 für Montag usw (wegen 1 als dritter Parameter ist dies die usa-Zählweise). Bei 1 ist es immer der 6. eines Monats (7-1), bei 2 immer der 5. eines Monats (7-2). Bei 3 und größer ist immer ein Wochenende dazwischen und dann müssen 7-1 Tage hinzugezählt werden. Dieses Datum muss dann nur noch mit dem aktuellen Datum verglichen werden und fertig ist der bool-Wert.
Löst das dein Problem?

Gruß
Ralf
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo nochmal,

meine schreibweise ist schrott, ich kann es mir nicht abgewöhnen. Bitte versuche
SELECT
DateAdd("d",
7-IIf(
Format(dateadd("d",-day(datum)+1, datum),"w",1)<=2,
Format(dateadd("d",-day(datum)+1, datum),"w",1),
-1),
CDate(dateadd("d",-day(datum)+1, datum))
)=[Datum] AS istFuefterWerktag, tblDatum.Datum
FROM tblDatum;

Grund: Sobald du in der Systemsteuerung von Windows in den Regions- und Sprachpotionen auf ein Format <> "Deutsch" umstellst, funktioniert meine erste Version nicht mehr (Syntaxfehler!), was auch vollkommen korrekt ist. Die neue Version ist "umschaltsicher".

Gruß
Ralf
0 Punkte
Beantwortet von deluxestyle Mitglied (901 Punkte)
hallo

vielen Dank für die Antwort.
Scheint aber ein spezieller SQL Dialekt zu sein?
Läuft nicht unter Oracle.
Kann man das auch in reinem SQL 92 schreiben?
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo,

die Info wäre am Anfang nicht schlecht gewesen. Im Stabdard SQL 92 ist das nach meinemWissen nicht möglich. Dennoch hier eine ORACLE-Variante:
select sysdate,
case when
case to_char(sysdate,'d')
when '1' then to_date ('05.' || to_char(sysdate,'MM.YYYY'))
when '7' then to_date ('06.' || to_char(sysdate,'MM.YYYY'))
else to_date ('07.' || to_char(sysdate,'MM.YYYY'))
end
= to_char(sysdate) then
'true'
else
'false'
end as weekday5,
from dual

Gruß Ralf
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Ups, ersetze
case to_char(sysdate,'d')
durch
case to_char(to_date('01.' || to_char(sysdate,'MM.YYYY')),'d')

Gruß Ralf
0 Punkte
Beantwortet von deluxestyle Mitglied (901 Punkte)
danke
das funktioniert
top
...