복붙노트

[SQL] 오라클의 기본 날짜 형식

SQL

오라클의 기본 날짜 형식

(내가 MySQL을 사용 해요) 오라클 SQL을 사용하여 처음. 나는 기본 날짜 형식이 무엇인지에 대한 정보를 충돌 찾는거야. 여러 시도가 MY_TABLE 문으로 내 INSERT와 TO_DATE를 사용하지 후에, 나는 마침내 내가 DD-MON-YY (즉, 25-JAN-18)이 기대를 사용하고 데이터베이스를 발견했다. 그러나 여기에 유래와 다른 곳에서 다양한 페이지에, 나는 말의 기본값은 YYYYMMDD 또는 DD / MM / YYYY 또는 YYYY-MM-DD 일부 것을 알 수있다. 왜 많은 정보 충돌 조각 그래서?

해결법

  1. ==============================

    1.오라클뿐만 아니라 다른 데이터베이스는 기본 형식을 설정할 수 있습니다. 아웃 박스, 형식 "RR"은 두 자리 연도를 말한다 (전형적) DD-MON-RR이다. 이 모호함 (두 자리 년?)와 국제화의 관점에서, 아주 형편없는 형식입니다 (국가가 실제로 기본 무엇을 위해?). 그러나 오라클은 오랜, 오랜 시간이 주위에있다.

    오라클뿐만 아니라 다른 데이터베이스는 기본 형식을 설정할 수 있습니다. 아웃 박스, 형식 "RR"은 두 자리 연도를 말한다 (전형적) DD-MON-RR이다. 이 모호함 (두 자리 년?)와 국제화의 관점에서, 아주 형편없는 형식입니다 (국가가 실제로 기본 무엇을 위해?). 그러나 오라클은 오랜, 오랜 시간이 주위에있다.

    표준 형식은 ISO, 국제 표준화기구에 의해 정의됩니다. 그들은 더 YYYY-MM-DD 같은에 정착했다. 사실, 하이픈은 선택 사항이지만 나는 그들이 날짜가 훨씬 더 쉽게 읽을 수 있도록 생각합니다.

    당신이 DATE를 사용하는 경우 오라클은이 형식에 상수를 허용합니다

    select DATE '2018-01-25'
    

    이것은 매우 편리합니다. 첫째, 합리적인 표준을 지원하는 좋은이다. 둘째, 코드에 관계없이 국제화 설정, 안전합니다. 물론 오라클 문서는 구체적으로이 문제를 다루고; 여기에서 시작하는 한 곳입니다.

  2. ==============================

    2.날짜에는 포맷이없는 -은 7 바이트 나타내는 년 (2 바이트) 및 월, 일,시, 분, 초 (1 바이트마다)로 내부적으로 저장된다.

    날짜에는 포맷이없는 -은 7 바이트 나타내는 년 (2 바이트) 및 월, 일,시, 분, 초 (1 바이트마다)로 내부적으로 저장된다.

    '25 잰-18 '은 날짜 아니다 - 그것은 텍스트 문자입니다.

    때 당신이 할 :

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

    오라클은 도움이 될하려고 형식 모델과 사용자의 세션에 대한 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 매개 변수를 설정할 수 있습니다. 대신 다음을 수행해야합니다

    당신이 당신의 세션에서 NLS_DATE_FORMAT을 변경하려는 경우 당신은 사용할 수 있습니다 :

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

    날짜는 형식을 가지고 있지 않기 때문에,이 질문은 이해가되지 않습니다. 우리는 질문 대신하는 경우 :

    (당신이 세계에 어디에 의존하므로) 그것은 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
    
  3. ==============================

    3.날짜는 날짜입니다 - 형식은 당신이 당신의 데이터를 쿼리 할 때 날짜가 표시되는 방법을 결정합니다.

    날짜는 날짜입니다 - 형식은 당신이 당신의 데이터를 쿼리 할 때 날짜가 표시되는 방법을 결정합니다.

    당신이 형식을 제공하고 TO_CHAR 기능을 사용하지 않을 경우, 우리는 기본 NLS_DATE_FORMAT의 날짜 다시 제공합니다 - 데이터베이스에 정의되어 있지만, 또한 세션에 대해 지정할 수 있습니다.

    세션 용 -

    select * from NLS_SESSION_PARAMETERS
    where PARAMETER = 'NLS_DATE_FORMAT';
    

    광산, 'DD-MON-YYYY'그래서 때 쿼리 SYSDATE :

    SQL> select sysdate from dual;
    
    SYSDATE    
    -----------
    03-MAY-2018
    

    날짜로 작업 할 때, 그것은 특정 날짜 형식을 가정 할 수 없습니다 일반적으로 가장 좋은 방법입니다. 그래서 날짜가 모두 INSERT 또는 SELECT 데이터는 명시 때. 예를 들어.

    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_TERRITORY에서 파생 (문서)

    당신이 모범 사례를 기억하고 기본이 무엇인지 생각하지, 그리고 날짜로 작업 할 때 당신이 당신의 날짜 형식으로 명시하는 경우 그러나, 당신은 확인해야합니다.

    우리는이 주제를 가지고 가장 좋은 가이드는 우리의 세계화 지원 설명서입니다. 이것은 당신에게 관심있는 섹션입니다.

  4. ==============================

    4.당신이 TO_DATE를 사용하여 날짜를 삽입 할 때 조심해야 할 유일한 것은 당신이 그것을 구문 분석하는 방법이다. 예: 무엇을 작동하지 않습니다 TO_DATE ('31 -03-2016 ','YYYY-MM-DD ')

    당신이 TO_DATE를 사용하여 날짜를 삽입 할 때 조심해야 할 유일한 것은 당신이 그것을 구문 분석하는 방법이다. 예: 무엇을 작동하지 않습니다 TO_DATE ('31 -03-2016 ','YYYY-MM-DD ')

    무엇을 작동합니다 TO_DATE ('31 -03-2016 ','DD-mm-YYYY ') TO_DATE ('31 -3 월-2016 ','YYYY-MM-DD ')

    당신이 TO_DATE와 형식으로 전달하는 날짜가 일치해야합니다. 31 - DD 월 - 월 2016 - YYYY

  5. from https://stackoverflow.com/questions/50163432/oracles-default-date-format by cc-by-sa and MIT license