当前位置: 首页 > 知识库问答 >
问题:

Oracle的默认日期格式

刘兴朝
2023-03-14

第一次使用Oracle SQL(我习惯使用MySQL)。我发现关于默认日期格式的信息有冲突。在多次尝试使用INSERT IN my\u table语句的to\u DATE之后,我终于找到了我正在使用的数据库expects DD-MON-YY(即2018年1月25日)。然而,在stackoverflow和其他地方的不同页面上,我看到一些人说默认值是YYYYMMDD或DD/MM/YYYY或YYYY-MM-DD。为什么会有这么多相互冲突的信息?

共有3个答案

万俟嘉珍
2023-03-14

日期是日期-该格式确定在查询数据时如何显示日期。

如果您没有提供格式并使用TO\u CHAR函数,我们将以默认的NLS\u DATE\u格式提供日期,该格式在数据库中定义,但也可以为您的会话指定。

为了你的治疗-

select * from NLS_SESSION_PARAMETERS
where PARAMETER = 'NLS_DATE_FORMAT';

我的是“DD-MON-YYYY”,所以当我查询SYSDATE时:

SQL> select sysdate from dual;

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

处理日期时,通常最好不要采用特定的日期格式。因此,当插入或选择带有日期的数据时,要明确。例如

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\U地区(docs)

但是,如果您记住了最佳实践,并且从不假设默认值是什么,并且在处理日期时明确使用了日期格式,那么您应该可以。

本主题的最佳指南是《全球化支持指南》。这是您感兴趣的部分。

毋澄邈
2023-03-14

Oracle以及其他数据库允许您设置默认格式。开箱即用的格式是(通常)DD-MON-RR,其中“RR”表示两位数的年份。从模棱两可的角度来看,这是一种非常糟糕的格式(两位数年份?)国际化(对于哪些国家来说,这实际上是默认的?)。但甲骨文已经存在了很久很久了。

国际标准组织ISO也定义了标准格式。他们选择了更像YYYY-MM-DD的方式。实际上,连字符是可选的,但我认为它们使日期更具可读性。

如果使用日期,Oracle接受此格式的常量:

select DATE '2018-01-25'

这非常方便。首先,支持合理的标准很好。其次,代码是安全的,无论国际化设置如何。Oracle留档当然详细介绍了这一点;这里是一个开始的地方。

乌杰
2023-03-14

日期没有格式-它在内部存储为7个字节,分别表示年(2个字节)和月、日、时、分和秒(每个字节1个字节)。

2018年1月25日不是日期,而是文本文字。

当您这样做时:

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

Oracle将尽力提供帮助,并使用用户会话的参数NLS\u date\u 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_stringformat_string[nls_values])并显式使用格式模型:

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

    如果确实要更改会话中的NLS\U DATE\U格式,则可以使用:

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

    默认日期格式是什么?

    由于日期没有格式,这个问题没有意义。相反,如果我们问:

    Oracle用于在字符串和日期之间转换的默认会话参数是什么?

    它取决于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
    

  •  类似资料:
    • 我正在尝试格式化结果,并在用户的当前设备区域设置中向用户显示它。 当前,我可以显示整个,如下所示: 2018-10-08 16:08:37.464112 或者通过像这样指定确切的格式: 这导致以下内容: 08.10.2018 我对这个解决方案的问题是,虽然这种格式在欧盟可能是可以接受的;例如,在美国(和许多其他国家),他们习惯于不同的日期格式,例如。 10/08/2018 我的问题是:如何以当前语

    • 问题内容: 我的日期来自数据库,如下所示: 我正在尝试使用Angular的日期过滤器将它们变成更漂亮的东西,但是… 要么 …只是吐出原始日期时间字符串:。没有错误。我究竟做错了什么? 更新 我看到MySQL的默认日期时间与Angular的数据过滤器期望的不兼容。我正在尝试像这样即时转换它,但会引发错误: 我怀疑我无法以尝试的方式实例化Date类。该错误是$ parse:syntax错误。 更新资料

    • 问题内容: 我在数据库中有ISO 8601格式的日期%。但是,当日期传递到模板时,它显示为。 有没有一种方法可以将格式调整为我想要的格式? 问题答案: date settings.DATE_FORMAT

    • 问题内容: 我已经使用Apache POI一段时间来以编程方式读取现有的Excel 2003文件。现在,我有一个新的要求,即在内存中创建整个.xls文件(仍然使用Apache POI),然后将它们最后写入文件中。困扰我的唯一问题是带日期的单元格的处理。 考虑以下代码: 当我将包含此单元格的工作簿写到文件中并用Excel打开它时,该单元格将显示为数字。是的,我确实意识到Excel将其“日期”存储为自

    • 如何在oracle中检查表中特定列的日期格式?oracle日期数据类型是否能够存储这两种格式(美国和欧洲)?如果是这样,有没有办法区分哪个是月份,哪个是日期?

    • 问题内容: 我目前正在使用当前习惯用法创建UTC DateTime对象 是否有任何默认方法,所以我可以使用默认构造函数创建基于UTC的DateTime对象,从而使其更加隐式? 问题答案: 如果您只想为joda时间设置默认时区,请使用。 如果要更改整个jvm使用的时区,请使用方法。只需确保将其设置为早,因为它可以按joda时间进行缓存。.. 引用: 默认时区来自系统属性user.timezone。如