iSeries Date conversion function

SELECT MyDateStrColumn, CAST(MY_TO_DATE(MyDateStrColumn) AS TIMESTAMP) FROM MyTable


-- ///////

CREATE OR REPLACE FUNCTION MY_TO_DATE (
    P_DATUM VARCHAR(100)
)
RETURNS DATE
LANGUAGE SQL
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
BEGIN
    DECLARE V1 VARCHAR(20);
    DECLARE V2 VARCHAR(20);
    DECLARE V3 VARCHAR(20);

    DECLARE N1 INTEGER;
    DECLARE N2 INTEGER;
    DECLARE N3 INTEGER;

    DECLARE V_DAG   INTEGER;
    DECLARE V_MAAND INTEGER;
    DECLARE V_JAAR  VARCHAR(4);

    -- Eerste 3 numerieke waarden uit de string halen
    SET V1 = REGEXP_SUBSTR(P_DATUM, '[0-9]+', 1, 1);
    SET V2 = REGEXP_SUBSTR(P_DATUM, '[0-9]+', 1, 2);
    SET V3 = REGEXP_SUBSTR(P_DATUM, '[0-9]+', 1, 3);

    -- Omzetten naar getallen
    SET N1 = TRY_CAST(V1 AS INTEGER);
    SET N2 = TRY_CAST(V2 AS INTEGER);
    SET N3 = TRY_CAST(V3 AS INTEGER);

    -- Geen geldige 3 getallen gevonden
    IF N1 IS NULL OR N2 IS NULL OR N3 IS NULL THEN
        RETURN NULL;
    END IF;

    -- 3e getal is altijd het jaar
    -- 2 cijfers = 20xx
    IF LENGTH(V3) = 2 THEN
        SET V_JAAR = '20' || V3;
    ELSE
        SET V_JAAR = V3;
    END IF;

    /*
       Standaard:
           dag / maand / jaar

       Als het 2e getal > 12 is:
           maand / dag / jaar
    */
    IF N2 > 12 THEN
        SET V_MAAND = N1;
        SET V_DAG   = N2;
    ELSE
        SET V_DAG   = N1;
        SET V_MAAND = N2;
    END IF;

    /*
       ISO-formaat:
           YYYY-MM-DD

       TRY_CAST zorgt ervoor dat bijvoorbeeld
       31-02-2024 -> NULL wordt.
    */
    RETURN TRY_CAST(
        V_JAAR
        || '-'
        || RIGHT('00' || DIGITS(V_MAAND), 2)
        || '-'
        || RIGHT('00' || DIGITS(V_DAG), 2)
        AS DATE
    );
END

102920cookie-checkiSeries Date conversion function