Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Định dạng DATE mặc định của Oracle

DATE không có định dạng - nó được lưu trữ bên trong dưới dạng 7 byte đại diện cho năm (2 byte) và tháng, ngày, giờ, phút và giây (mỗi byte 1 byte).

'25-JAN-18' không phải là một ngày - nó là một văn bản theo nghĩa đen.

Khi bạn làm:

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

Oracle sẽ cố gắng tỏ ra hữu ích và thực hiện truyền ngầm từ một chuỗi thành một ngày bằng cách sử dụng NLS_DATE_FORMAT tham số cho phiên của người dùng dưới dạng mô hình định dạng. Vì vậy, câu lệnh của bạn sẽ được chuyển đổi hoàn toàn thành:

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

Bất kỳ người dùng nào cũng có thể đặt thông số NLS của họ trong phiên của riêng họ (vì vậy bạn không bao giờ dựa vào chuyển đổi ngầm định vì mỗi người dùng có thể có cài đặt khác nhau cho phiên của riêng họ và có thể thay đổi các giá trị giữa phiên). Thay vào đó, bạn nên:

  • Sử dụng chữ Ngày:

    DATE '2018-01-25'
    
  • Sử dụng ký tự Dấu thời gian

    TIMESTAMP '2018-01-25 01:23:45'
    
  • Sử dụng TO_DATE( date_string, format_string [, nls_values] ) và sử dụng một cách rõ ràng mô hình định dạng:

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

Nếu bạn muốn thay đổi NLS_DATE_FORMAT trong phiên của bạn thì bạn có thể sử dụng:

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

Định dạng ngày mặc định là gì?

Kể từ một DATE không có định dạng, câu hỏi này không có ý nghĩa. Thay vào đó nếu chúng tôi hỏi:

NLS_DATE_FORMAT mặc định là gì tham số phiên mà Oracle sử dụng để chuyển đổi giữa chuỗi và ngày?

Nó phụ thuộc vào NLS_TERRITORY tham số phiên (vì vậy nó phụ thuộc vào vị trí của bạn trên thế giới):

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;

Xuất ra định dạng ngày tháng và danh sách các lãnh thổ tương ứng với định dạng đó:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tăng hiệu suất cho INSERT hàng loạt vào bảng được liên kết ODBC trong Access?

  2. Cách sử dụng quảng cáo phân tán để giảm thời gian vá lỗi trong Oracle EBS

  3. Tính tuổi của Oracle từ Ngày sinh và Ngày nay

  4. 2 cách chuyển đổi sang chữ hoa trong Oracle

  5. Làm cách nào để chọn các cột từ bảng có giá trị không rỗng?