programing

Oracle의 기본 DATE 형식

jooyons 2023. 7. 4. 21:53
반응형

Oracle의 기본 DATE 형식

Oracle SQL을 처음 사용합니다(MySQL에 익숙합니다).기본 날짜 형식이 무엇인지에 대해 충돌하는 정보를 찾고 있습니다.TO_DATE를 my_table 문에 삽입하여 사용해야 하는 여러 번의 시도 끝에 마침내 사용 중인 데이터베이스가 DD-MON-YY(즉, 25-JAN-18)로 예상된다는 것을 알게 되었습니다.하지만 여기 스택 오버플로와 다른 곳의 다양한 페이지에서 기본값이 YYYYMMDD 또는 DD/MM/YYYYY 또는 YYY-MM-DD라고 하는 일부 페이지를 볼 수 있습니다.왜 그렇게 상충되는 정보가 많습니까?

A DATE에는 형식이 없습니다. 내부적으로 연도(2바이트)와 월, 일, 시, 분 및 초(각각 1바이트)를 나타내는 7바이트로 저장됩니다.

'25-JAN-18'날짜가 아닙니다. 텍스트 리터럴입니다.

다음 작업을 수행할 때:

INSERT INTO table_name ( date_column ) VALUES ( '25-JAN-18' );

Oracle은 도움이 되도록 노력하고 문자열에서 날짜까지 암시적 캐스트를 수행합니다.NLS_DATE_FORMAT형식 모델로 사용자 세션에 대한 매개 변수입니다.따라서 귀하의 진술은 암시적으로 다음과 같이 변환됩니다.

INSERT INTO table_name ( date_column ) VALUES (
  TO_DATE(
    '25-JAN-18',
    ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
  )
);

모든 사용자는 자신의 세션에서 NLS 매개 변수를 설정할 수 있습니다. 따라서 각 사용자는 자신의 세션에 대해 서로 다른 설정을 가질 수 있고 세션 중간에 값을 변경할 수 있으므로 절대 암묵적 변환에 의존해서는 안 됩니다.대신 다음을 수행해야 합니다.

  • 날짜 리터럴 사용:

    DATE '2018-01-25'
    
  • 타임스탬프 리터럴 사용

    TIMESTAMP '2018-01-25 01:23:45'
    
  • 사용하다TO_DATE( date_string, format_string [, nls_values] )형식 모델을 명시적으로 사용합니다.

    TO_DATE( '25-JUN-18', 'DD-MON-RR' )
    

변경할 경우NLS_DATE_FORMAT세션에서 다음을 사용할 수 있습니다.

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

기본 날짜 형식은 무엇입니까?

그 이후로DATE형식이 없습니다. 이 질문은 의미가 없습니다.대신에 우리가 묻는다면:

기본값은 무엇입니까?NLS_DATE_FORMATOracle이 문자열과 날짜 사이에서 변환하는 데 사용하는 세션 매개 변수는 무엇입니까?

그것은 그것에 따라 다릅니다.NLS_TERRITORY세션 매개 변수(따라서 현재 위치에 따라 다름):

SET SERVEROUTPUT ON;

VARIABLE cur REFCURSOR;

DECLARE
  territories SYS.ODCIVARCHAR2LIST;
  formats     SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
BEGIN
  select value
  BULK COLLECT INTO territories
  from v$nls_valid_values
  where parameter = 'TERRITORY'
  order by value;

  formats.EXTEND( territories.COUNT );
  FOR i IN 1 .. territories.COUNT LOOP
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TERRITORY='''||territories(i)||'''';

    SELECT value
    INTO   formats(i)
    FROM   NLS_SESSION_PARAMETERS
    WHERE  PARAMETER = 'NLS_DATE_FORMAT';
  END LOOP;

  OPEN :cur FOR
  SELECT CAST( f.format AS VARCHAR2(12) ) AS format,
         LISTAGG( t.territory, ', ' ) WITHIN GROUP ( ORDER BY t.territory ) AS territories
  FROM   ( SELECT ROWNUM AS rn, COLUMN_VALUE AS territory FROM TABLE( territories ) ) t
         INNER JOIN
         ( SELECT ROWNUM AS rn, COLUMN_VALUE AS format FROM TABLE( formats ) ) f
         ON ( f.rn = t.rn )
  GROUP BY f.format;
END;
/

PRINT :cur;

날짜 형식과 해당 형식에 해당하는 영역 목록을 출력합니다.

FORMAT       TERRITORIES
------------ ------------------------------------------------------------------
DD MON RRRR  THAILAND
DD-MM-RR     ALGERIA, BAHRAIN, INDIA, MOROCCO, THE NETHERLANDS, TUNISIA
DD-MM-RRRR   BANGLADESH, INDONESIA, ROMANIA, VIETNAM
DD-MON-RR    AMERICA, CHINA, HONG KONG, IRELAND, ITALY, PAKISTAN, TAIWAN,
             UNITED KINGDOM
DD-MON-RRRR  ISRAEL
DD.MM.RR     AUSTRIA, BELARUS, CIS, CROATIA, CZECH REPUBLIC, CZECHOSLOVAKIA,
             GERMANY, RUSSIA, SLOVAKIA, SLOVENIA, SWITZERLAND
DD.MM.RRRR   ALBANIA, AZERBAIJAN, ESTONIA, FINLAND, FYR MACEDONIA, ICELAND,
             KAZAKHSTAN, MACEDONIA, NORWAY, SERBIA AND MONTENEGRO, UKRAINE,
             YUGOSLAVIA
DD.MM.RRRR.  MONTENEGRO, SERBIA
DD.fmMM.RRRR ARMENIA
DD/MM/RR     AFGHANISTAN, BELGIUM, BRAZIL, CAMEROON, CATALONIA, CHILE, COLOMBIA,
             CONGO BRAZZAVILLE, CONGO KINSHASA, COSTA RICA, CYPRUS, DJIBOUTI,
             EGYPT, EL SALVADOR, FRANCE, GABON, GREECE, GUATEMALA, HONDURAS,
             IRAQ, IVORY COAST, JORDAN, KUWAIT, LEBANON, LIBYA, LUXEMBOURG,
             MAURITANIA, MEXICO, NEW ZEALAND, NICARAGUA, OMAN, PANAMA, PERU,
             PUERTO RICO, QATAR, SAUDI ARABIA, SINGAPORE, SOMALIA, SPAIN, SUDAN,
             SYRIA, UNITED ARAB EMIRATES, URUGUAY, VENEZUELA, YEMEN
DD/MM/RRRR   ARGENTINA, BAHAMAS, BERMUDA, ECUADOR, MALAYSIA, SENEGAL, TURKEY,
             UGANDA, ZAMBIA
DD/MON/RR    AUSTRALIA, SOUTH AFRICA, UZBEKISTAN
DD/fmMM/RRRR LAOS, NIGERIA
MM/DD/RRRR   PHILIPPINES
RR-MM-DD     CANADA, DENMARK, JAPAN
RR-MON-DD    HUNGARY
RR.MM.DD     PORTUGAL
RR/MM/DD     KOREA, POLAND
RRRR-MM-DD   BULGARIA, SWEDEN
RRRR-fmMM-DD CAMBODIA
RRRR.MM.DD   LATVIA, LITHUANIA
RRRR/fmMM/fm IRAN, SRI LANKA
fmDD-MM-RR   BOLIVIA
fmDD/MM/RR   PARAGUAY
fmDD/MM/RRRR BELIZE, ETHIOPIA, MALTA, NEPAL
fmDD/fmMM/RR MALDIVES
fmMM.DD.RRRR BOSNIA AND HERZEGOVINA
fmMM/DD/RRRR KENYA, TANZANIA

다른 데이터베이스뿐만 아니라 오라클에서도 기본 형식을 설정할 수 있습니다.기본 제공 형식은 (일반적으로) DD-MON-RR이며, 여기서 "RR"은 두 자리 연도를 나타냅니다.이것은 모호성(두 자릿수 연도?)과 국제화(어떤 국가의 경우 실제로 기본값입니까?)의 관점에서 볼 때 꽤 형편없는 형식입니다.하지만 Oracle은 오랫동안 존재해 왔습니다.

표준 형식은 또한 국제 표준 기구인 ISO에 의해 정의됩니다.그들은 YYYY-MM-DD와 비슷한 것을 결정했습니다.사실 하이픈은 선택 사항이지만, 날짜를 훨씬 더 읽을 수 있게 해주는 것 같아요.

은 다을사은경우는 오라클허이다용상을 이 합니다.DATE:

select DATE '2018-01-25'

이것은 매우 편리합니다.첫째, 합리적인 기준을 지원하는 것이 좋습니다.둘째, 코드는 국제화 설정에 관계없이 안전합니다.물론 Oracle 설명서에서는 이에 대해 자세히 설명합니다. 여기 한 가지 시작할 부분이 있습니다.

DATE는 DATE입니다. 이 형식은 데이터를 쿼리할 때 DATE를 표시하는 방법을 결정합니다.

형식을 제공하지 않고 TO_CHAR 함수를 사용하는 경우 데이터베이스에 정의되어 있지만 세션에 대해 지정할 수 있는 기본 NLS_DATE_FORMAT로 DATE를 다시 제공합니다.

세션을 위해 -

select * from NLS_SESSION_PARAMETERS
where PARAMETER = 'NLS_DATE_FORMAT';

내 이름은 'DD-MON-YYY'이므로 SYSDATE를 조회할 때:

SQL> select sysdate from dual;

SYSDATE    
-----------
03-MAY-2018

DATE를 사용할 때는 일반적으로 특정 날짜 형식을 가정하지 않는 것이 좋습니다.따라서 날짜가 있는 데이터를 삽입하거나 선택할 때는 명시적이어야 합니다.예를들면.

SQL> drop table JUST_DATES;

Table JUST_DATES dropped.

SQL> 
SQL> create table JUST_DATES (
  2      DATE1 date
  3  );

Table JUST_DATES created.

SQL> 
SQL> insert   into JUST_DATES values ( to_date('01-01-2018','MM-DD-YYYY') );

1 row inserted.

SQL> 
SQL> select to_char(
  2      DATE1,
  3      'MON/DD/RR'
  4  )
  5    from JUST_DATES;

TO_CHAR(DATE1,'MON
------------------
JAN/01/18

이제 질문에 답하겠습니다. 기본값은 무엇입니까?글쎄, 그건 달라요.

NLS_TERRORITY(문서)에서 파생되었습니다.

그러나 모범 사례를 기억하고 있지만 기본값이 무엇인지 전혀 가정하지 않고 DATE를 사용할 때 날짜 형식을 명시적으로 사용할 경우에는 문제가 없습니다.

이 주제에 대한 최고의 가이드는 글로벌화 지원 가이드입니다.이것이 당신의 관심 분야입니다.

할 때 해야 할 은 짜를삽때주의할야사다항같음다습과니은날해입입니다.TO_DATE해석하는 방법입니다.

예:
하지 것 »
to_date('31-03-2016','dd-mon-yyyy')

무엇이 효과가 있을까요?
to_date('31-03-2016','dd-mm-yyyy') to_date('31-Mar-2016','dd-Mon-yyyy')

로 하는 날짜to_date및 형식이 일치해야 합니다.
31 - dd
Mar - Mon
2016 - yyyy

언급URL : https://stackoverflow.com/questions/50163432/oracles-default-date-format

반응형