27. Juni 2007

Deutscher Wochentag

Das grosse Problem von "to_char (sysdate, 'D')" ist, dass abhängig vom NLS unterschiedliche Resultate herauskommen:

Sonntag ist der erste Wochentag in den USA
Montag ist der erste Wochentag in Deutschland

Grün-Donnerstag 2000 zum Beispiel:

Green_Thursday := to_date ('23.03.2000', 'DD.MM.YYYY');
in den USA: to_char (Green_Thursday, 'D') = 5
in der BRD: to_char (Green_Thursday, 'D') = 4

Das ist sub-optimal, da die Formatmaske abhängig von der NLS ist.

Meine Lösung in diesem Fall ist: Die Funktion German_Weekday

FUNCTION German_Weekday (P_Date IN DATE)
RETURN NUMBER IS
V_Delta NUMBER;
BEGIN
-- Referenz-Tag: Grün Donnerstag 2000 = Tag 4 in Deutschland
V_Delta := TO_NUMBER (TO_CHAR (TO_DATE ('23.03.2000',
'DD.MM.YYYY'),
'D')) - 4;
RETURN (TO_NUMBER (TO_CHAR (P_Date-V_Delta, 'D')));
END;

und American_Weekday

FUNCTION American_Weekday (P_Date IN DATE)
RETURN NUMBER IS
V_Delta NUMBER;
BEGIN
-- Referenz-Tag: Grün Donnerstag 2000 = Tag 5 in USA
V_Delta := TO_NUMBER (TO_CHAR (TO_DATE ('23.03.2000',
'DD.MM.YYYY'),
'D')) - 5;
RETURN (TO_NUMBER (TO_CHAR (P_Date-V_Delta, 'D')));
END;

diese Funktion gibt nun immer den korrekten deutschen Wochentag zurück, unabhängig von der NLS.

viel Spass damit
Gerd

Keine Kommentare: