Mac De PL/SQL RSS Reader #13 Tweet
前回の続き。ストアドファンクションrfc822_dateStrToTimestampLTZ()のソースコードは以下の通り。
CREATE OR REPLACE FUNCTION RFC822_DateStrToTimeStampLTZ
(
i_dateTimeString IN VARCHAR2
)
RETURN TIMESTAMP WITH LOCAL TIME ZONE
AS
v_tempTimeStampTz TIMESTAMP WITH LOCAL TIME ZONE := NULL;
v_dateTimeString VARCHAR2(50) := NULL;
v_timeStampTzFormat VARCHAR2(40) := NULL;
c_nls_date_language CONSTANT VARCHAR2(40) := 'NLS_DATE_LANGUAGE=AMERICAN';
BEGIN
v_dateTimeString := UPPER(i_dateTimeString);
IF v_dateTimeString IS NULL THEN
RETURN NULL;
END IF;
IF REGEXP_INSTR(v_dateTimeString, '^[A-Z]{3}\, ') >= 1 THEN
v_timeStampTzFormat := v_timeStampTzFormat || 'DY, ';
END IF;
v_timeStampTzFormat := v_timeStampTzFormat || 'DD MON RRRR';
IF REGEXP_INSTR(v_dateTimeString, '[0-9]{2}:[0-9]{2}:[0-9]{2}') >= 1 THEN
v_timeStampTzFormat := v_timeStampTzFormat || 'HH24:MI:SS ';
ELSIF REGEXP_INSTR(v_dateTimeString, '[0-9]{2}:[0-9]{2}') >= 1 THEN
v_timeStampTzFormat := v_timeStampTzFormat || 'HH24:MI ';
END IF;
IF REGEXP_INSTR(v_dateTimeString, ' (\+|\-)[0-9]{4}$') >= 1 THEN
v_timeStampTzFormat := v_timeStampTzFormat || 'TZHTZM';
ELSIF REGEXP_INSTR(v_dateTimeString, ':[0-9]{2}$') = 0
AND REGEXP_INSTR(v_dateTImeString, '[0-9]{2} [A-Z]{3} [0-9]{2,4}$') = 0
AND REGEXP_INSTR(v_dateTImeString, ' [A-Z]{1,3}$') >= 1 THEN
v_timeStampTzFormat := v_timeStampTzFormat || 'TZR';
END IF;
v_tempTimeStampTz := TO_TIMESTAMP_TZ(
v_dateTimeString,
v_timeStampTzFormat,
c_nls_date_language
);
RETURN v_tempTimeStampTz;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(
-20001,
'RFC822_DateStrToTimeStampLTZ():' || SQLERRM()
);
END;
/というように、日付/時間文字列を一旦、TO_TIMESTAMP_TZ()関数でTIMESTAMP WITH TIME ZONE型に変換する。この時点でタイムゾーンリージョンが指定されていれば、夏時間も考慮され変換される。最終的に、TIMESTAMP WITH LOCAL TIME ZONE型で返すようにした。(尚、入力される日付/日時文字列が、RFC822形式であることを前提にしているため文字列妥当性などのチェックは厳密は行っていない。)
・・・・ファンクション名は変えたほうがいいか・・・・
聞いている曲:今日もSmooth Jazzで。
Warren Hill - Popjazz - Toronto![]()
| 固定リンク | 0
コメント