LoginSignup
0
0

More than 3 years have passed since last update.

Oracle 新元号対応

Posted at
SQL> -- 新元号「令和」と略称「R」のEUC文字コードを調べる。
SQL> SELECT
  2      DUMP(CONVERT('令和', 'JA16EUC' , 'AL32UTF8'), 16) AS REIWA
  3    , DUMP(CONVERT('R'   , 'JA16EUC' , 'AL32UTF8'), 16) AS R
  4  FROM DUAL ;

REIWA                                            R
------------------------------------------------ ------------------------------
Typ=1 Len=4: ce,e1,cf,c2                         Typ=1 Len=1: 52
-- ${ORACLE_HOME}/nls の定義ファイル(テキストファイル) lxecal.nlt をテキストエディタで開く。なければ作る。
DEFINE calendar
    calendar_name = "Japanese Imperial"
    DEFINE calendar_era
        era_full_name = cee1cfc2       -- 令和(EUC hex)
        era_abbr_name = 52             -- R
        start_date = "MAY-01-2019 AD"  -- 元年
        end_date   = "DEC-31-9999 AD"  -- 最終日(仮)
        ENDDEFINE calendar_era
ENDDEFINE calendar
-- lxegen実行
-- コマンドプロンプトから
lxegen

NLS Calendar Utility: Release 18.0.0.0.0 - Production
Version 18.1.0.0.0

Copyright (c) 1994, 2018, Oracle.  All rights reserved.
-- Oracle Database を再起動
SQL> shutdown immediate ;
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup
ORACLEインスタンスが起動しました。

Total System Global Area    1610610024 bytes
Fixed Size                     9028968 bytes
Variable Size                620756992 bytes
Database Buffers             973078528 bytes
Redo Buffers                   7745536 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL>
SQL> -- 動作確認
SQL> COLUMN GREGORIAN_CALENDAR  FORMAT A18
SQL> COLUMN SHORT_ERA           FORMAT A9
SQL> COLUMN LONG_ERA            FORMAT A16
SQL> SELECT
  2      TO_CHAR(B.DATES, 'YYYY/MM/DD') AS GREGORIAN_CALENDAR
  3    , TO_CHAR(B.DATES, 'EYY/MM/DD'           , 'NLS_CALENDAR=''JAPANESE IMPERIAL''') AS SHORT_ERA
  4    , TO_CHAR(B.DATES, 'EEYY"年"MM"月"DD"日"', 'NLS_CALENDAR=''JAPANESE IMPERIAL''') AS LONG_ERA
  5  FROM(
  6      -- DATE_FROM <= 範囲 <= DATE_TO
  7      SELECT A.DATE_FROM + ROWNUM - 1 AS DATES
  8      FROM(
  9          SELECT TO_DATE('2019/04/25', 'YYYY/MM/DD') AS DATE_FROM
 10               , TO_DATE('2019/05/05', 'YYYY/MM/DD') AS DATE_TO
 11          FROM DUAL
 12          ) A
 13      CONNECT BY LEVEL <= A.DATE_TO - A.DATE_FROM + 1
 14      ) B ;

GREGORIAN_CALENDAR SHORT_ERA LONG_ERA
------------------ --------- ----------------
2019/04/25         H31/04/25 平成31年04月25日
2019/04/26         H31/04/26 平成31年04月26日
2019/04/27         H31/04/27 平成31年04月27日
2019/04/28         H31/04/28 平成31年04月28日
2019/04/29         H31/04/29 平成31年04月29日
2019/04/30         H31/04/30 平成31年04月30日
2019/05/01         R01/05/01 令和01年05月01日
2019/05/02         R01/05/02 令和01年05月02日
2019/05/03         R01/05/03 令和01年05月03日
2019/05/04         R01/05/04 令和01年05月04日
2019/05/05         R01/05/05 令和01年05月05日

11行が選択されました。

Oracle Database に 新しい元号(年号)Oracle Database に 新しい元号(年号)
Oracle Database の DUMP関数 と CONVERT関数 で 文字列のバイトコードを調べる。
Oracle SQL 連番や連続した日付を取得

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0