Announcement

Collapse
No announcement yet.

Verständnisfrage oder wo liegt mein Problem?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verständnisfrage oder wo liegt mein Problem?

    Hallo Forum,

    heute hätte ich eine Verständnisfrage. Ich habe folgendes Problem.
    Das Datenbankfeld ted.kpr_feas_done_date ist ein Datumsfeld. In einer
    View bestimme ich um welchen Wochentag es sich handelt und rechne
    dann vom Datum zurück. Das Ergebnis soll als versendedatum abgelegt
    werden.

    Jetzt mein Problem: Ich benötige dieses versendedatum als string, genau
    wie beim aktdatum.

    Zwischen drin ist eine Variante von mir auskommentiert, die immer auf die
    Nase fällt. Wer kann mir weiterhelfen.

    ted.kpr_feas_done_date,
    CASE
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 1
    THEN ted.kpr_feas_done_date - 5
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 2
    THEN ted.kpr_feas_done_date - 5
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 3
    THEN ted.kpr_feas_done_date - 5
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 4
    THEN ted.kpr_feas_done_date - 3
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 5
    THEN ted.kpr_feas_done_date - 3
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 6
    THEN ted.kpr_feas_done_date - 3
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 3
    THEN ted.kpr_feas_done_date - 4
    ELSE sysdate
    END AS versendedatum,
    --> TO_CHAR(versendedatum, 'DD.MM.YY') as senddatum,
    TO_CHAR(sysdate, 'DD.MM.YY') AS aktdatum
    FROM t_prs_dat,
    ...

    Danke und Gruß
    vogste

  • #2
    Die Aussage "Ich benötige dieses versendedatum als string" lasse ich jetzt mal unkommentiert.

    Du kannst innerhalb der Query nicht auf ein Alias Feld zugreifen, sondern must über eine Sub-Query gehen, z.B. so:
    [HIGHLIGHT=sql]
    WITH t AS
    (SELECT
    CASE
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 1
    THEN ted.kpr_feas_done_date - 5
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 2
    THEN ted.kpr_feas_done_date - 5
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 3
    THEN ted.kpr_feas_done_date - 5
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 4
    THEN ted.kpr_feas_done_date - 3
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 5
    THEN ted.kpr_feas_done_date - 3
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 6
    THEN ted.kpr_feas_done_date - 3
    WHEN TO_CHAR(ted.kpr_feas_done_date,'D') = 3
    THEN ted.kpr_feas_done_date - 4
    ELSE SYSDATE
    END AS versendedatum
    FROM t_prs_dat)
    SELECT TO_CHAR(versendedatum, 'DD.MM.YY') AS senddatum, TO_CHAR(SYSDATE, 'DD.MM.YY') AS aktdatum
    FROM t
    [/HIGHLIGHT]

    Die Abfrage enthält noch einen Fallstrick: Die Funktion TO_CHAR(...,'D') ist abhängig von den NLS-Settings und diese sind per Session festgelegt. Wenn jemand auf seinem lokalen Rechner beispielsweise "AMERICA" als NLS_Territory definiert hat, bekommt er etwas anderes.

    Wenn du sicher gehen willst musst du entweder vorher sicherstellen, dass "GERMANY" oder ähnliches als NLS_Territory gesetzt ist oder du geht über den ausgeschriebenen Wochentag, z.B.

    CASE TO_CHAR(ted.kpr_feas_done_date, 'Dy', 'NLS_DATE_LANGUAGE = german') = 'Mo'
    ...
    CASE TO_CHAR(ted.kpr_feas_done_date, 'Dy', 'NLS_DATE_LANGUAGE = german') = 'Di'


    Gruss

    Comment


    • #3
      Hallo Wernfried,

      erst einmal vielen Dank für die schnelle Hilfe. Sorry sollte natürlich nicht "als string" heißen.
      Jetzt werde ich mal versuchen Deinen Tipp in die Tat umzusetzen.

      Danke und Gruß
      Stephan

      Comment

      Working...
      X