Announcement

Collapse
No announcement yet.

Vergleich zweier Quartale funktioniert nicht

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

  • Vergleich zweier Quartale funktioniert nicht

    Hallo Zusammen,

    habe folgendes Problem
    bei diesem Vergleich
    where to_char(to_date(trim(datum),'YYYYmmdd'),'qyy')<to_ char(to_date('010'||quartal,'ddmmyyyy'),'qyy')

    wird Oracle folgendes aus

    ORA-01841: (Volles) Jahr muss zwischen -4713 und +9999 liegen und darf nicht 0 sein
    01841. 00000 - "(full) year must be between -4713 and +9999, and not be 0"
    *Cause: Illegal year entered
    *Action: Input year in the specified range

    Als Datum lässt es sich problemlos durch die ganze Tabelle so bearbeiten, einige Zeilen funktioneieren auch mit dem Abgleich.

    Kennt da jemand von Euch das Problem? Und gerne auch die Lösung

    Problem kann durch eine Erstellung einer Zweittabelle natürlich umgangen werden, finde diesen Weg jedoch sehr uncharmant.

    Vielen Dank

    Viele Grüße

    Martin

  • #2
    Du scheinst Dir ja sicher zu sein, dass die Formatmasken ok sind, hab ich mir also nicht angeschaut. (Wobei ich schon etwas auf 'qyy'<'qyy' schiele- ich würde bei Größenvergleich sicher das Jahr- die größere Einheit- vor eine kleinere Einheit stellen.)
    Ich denke meine erste Wahl ist einfach ein Werte / Rangeerror (wie ja auch die Fehler-Meldung nahelegt)
    Hast Du schon mal ein Order by auf die betroffenen Daten gemacht?
    Oder einfach eine zusätzliche Wherebedingung, allerdings eine Ebene vorher, die nur Zeilen mit gültigen Werten liefert.
    Gruß, defo

    Comment


    • #3
      Eigenartig, dass es immer noch Leute gibt, die das Jahr nur zweistellig angeben. Vermutlich haben die ihre Informatikausbildung vor weniger als 14 Jahren gemacht.

      Egal, funktioniert es so?
      [HIGHLIGHT=sql] WHERE TO_CHAR(TO_DATE(TRIM(datum),'YYYYmmdd'),'yyyyq') < TO_CHAR(TO_DATE(datum, 'yyyymmdd'),'yyyy') || quartal
      [/HIGHLIGHT]
      Zuletzt editiert von Wernfried; 20.05.2014, 16:26. Reason: Eine Klammer zu viel

      Comment


      • #4
        Originally posted by defo View Post
        Du scheinst Dir ja sicher zu sein, dass die Formatmasken ok sind, hab ich mir also nicht angeschaut. (Wobei ich schon etwas auf 'qyy'<'qyy' schiele- ich würde bei Größenvergleich sicher das Jahr- die größere Einheit- vor eine kleinere Einheit stellen.)
        Ich denke meine erste Wahl ist einfach ein Werte / Rangeerror (wie ja auch die Fehler-Meldung nahelegt)
        Hast Du schon mal ein Order by auf die betroffenen Daten gemacht?
        Oder einfach eine zusätzliche Wherebedingung, allerdings eine Ebene vorher, die nur Zeilen mit gültigen Werten liefert.
        Hallo,

        denke habe alles auf Plausibilität hin geprüft ist. Die Daten werden so nach irgendwelchen Verträgen geliefert.
        Das Datum im Format yyyymmdd und das Quartal in QYYYY.

        Im Grunde wird im Datum ein Leistungserbringungsdatum angeliefert. Im Quartal das Abrechnungsquartal.
        Das Quartal des Leistungserbringungsdatum darf so nicht kleiner als das Abrechnungsquartal sein.

        Könnte es auch sicherlich über den ersten des Quartals abgleichen bzw übewr eine extra Tabelle. Mich verwundert halt, dass es Fälle zu geben scheint, welche ausserhalb des erlaubten Jahreskreislaufes sind.

        Dass die Masken OK sind, da gehe ich von aus, wenn ich das ganze über die Rownum beschränke, funktioniert es.
        Jedes Datum lässt sich auch über to_date formatieren.

        Ich hoffe, ich konnte Deine (oder besser meine ) Frage beantworten.

        Vielen Dank und Grüße

        Martin

        Comment


        • #5
          Hallo Wernfried,

          entweder konnte ich Dein SQL nicht übersetzen oder es funktioniert nicht.
          Evtl. habe ich mich auch missverständlich ausgedrückt. Quartal und Datum sind zwei verschiedene Columns.

          Danke Dir!

          Viel Grüße

          Martin

          P.S, wer sich solche Daten ausdenkt, hat eher nichts mit Informatil zu tun

          Comment


          • #6
            Originally posted by Martin R. View Post
            Hallo Wernfried,

            entweder konnte ich Dein SQL nicht übersetzen oder es funktioniert nicht.
            Evtl. habe ich mich auch missverständlich ausgedrückt. Quartal und Datum sind zwei verschiedene Columns.
            Ein Klammer war zu viel, bitte nochmal testen.

            Comment


            • #7
              Originally posted by Wernfried View Post
              Ein Klammer war zu viel, bitte nochmal testen.
              Hallo Wernfried,

              die ist mir aufgefallen. Habe scheinbar etwas anderes nicht richtig übersetzt.

              WHERE TO_CHAR(TO_DATE(TRIM(datum),'YYYYmmdd'),'yyyyq') < to_char(to_date('010'||quartal,'ddmmyyyy'),'yyyy') || substr(quartal,1,1)

              Und danke, ja, so funktioniert es, verstehe nicht, warum mein o.a. in der where Klausel nicht funktionierte in einem ctas aber schon.

              Nochmals vielen Dank!

              Viele Grüße

              Martin

              Comment


              • #8
                Warum lässt Du nicht ORACLE die Arbeit machen und arbeitest einfach mit DATE-Typen, anstatt diese mühsam in STRING zu wandeln und zu vergleichen ?
                Code:
                WITH dates(datum) AS
                 (SELECT '20131231' FROM dual UNION ALL
                  SELECT '20140101' FROM dual UNION ALL
                  SELECT '20140227' FROM dual UNION ALL
                  SELECT '20140309' FROM dual UNION ALL
                  SELECT '20140403' FROM dual UNION ALL
                  SELECT '20140531' FROM dual UNION ALL
                  SELECT '20140601' FROM dual UNION ALL
                  SELECT '20140701' FROM dual UNION ALL
                  SELECT '20140831' FROM dual),
                     quarts(quartal) AS
                 (SELECT '12014' FROM dual UNION ALL
                  SELECT '42014' FROM dual UNION ALL
                  SELECT '72014' FROM dual UNION ALL
                  SELECT '12015' FROM dual)
                SELECT datum, quartal,  TO_DATE(TRIM(datum),'YYYYmmdd') adat, to_date('010'||quartal,'ddmmyyyy') qdat
                  FROM dates, quarts
                 WHERE TO_DATE(TRIM(datum),'YYYYmmdd') < to_date('010'||quartal,'ddmmyyyy')
                ORDER BY adat, qdat;  
                
                DATUM        QUARTAL   ADAT              QDAT
                ---------------------------------------------------------
                20140309	42014	09.03.2014	01.04.2014
                20140309	72014	09.03.2014	01.07.2014
                20140309	12015	09.03.2014	01.01.2015
                20140403	72014	03.04.2014	01.07.2014
                20140403	12015	03.04.2014	01.01.2015
                20140531	72014	31.05.2014	01.07.2014
                20140531	12015	31.05.2014	01.01.2015
                20140601	72014	01.06.2014	01.07.2014
                20140601	12015	01.06.2014	01.01.2015
                20140701	12015	01.07.2014	01.01.2015
                20140831	12015	31.08.2014	01.01.2015
                Wie machst Du das eigentlic mit dem 4. Quartal beim Vergleich ?

                Comment

                Working...
                X