gpt4 book ai didi

sql - Oracle 的默认 DATE 格式

转载 作者:行者123 更新时间:2023-12-04 04:56:36 24 4
gpt4 key购买 nike

第一次使用 Oracle SQL(我已经习惯了 MySQL)。我发现有关默认日期格式的信息存在冲突。在多次尝试将 TO_DATE 与我的 INSERT INTO my_table 语句一起使用后,我终于找到了我使用的数据库期望 DD-MON-YY(即 25-JAN-18)。然而,在 stackoverflow 和其他地方的各个页面上,我看到一些说默认是 YYYYMMDD 或 DD/MM/YYYY 或 YYYY-MM-DD。为什么会有这么多相互矛盾的信息?

最佳答案

一个 DATE没有格式 - 它在内部存储为 7-bytes表示年(2 个字节)和月、日、时、分和秒(各 1 个字节)。
'25-JAN-18'不是日期 - 它是文本文字。

当你这样做时:

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

Oracle 将尝试提供帮助并使用 NLS_DATE_FORMAT 执行从字符串到日期的隐式转换。用户 session 的参数作为格式模型。因此,您的语句将被隐式转换为:
INSERT INTO table_name ( date_column ) VALUES (
TO_DATE(
'25-JAN-18',
( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
)
);

任何用户都可以在他们自己的 session 中设置他们的 NLS 参数(所以你应该 从不 依赖隐式转换,因为每个用户可以为自己的 session 设置不同的设置,并且可以在 session 中更改值)。相反,您应该:
  • 使用日期文字:
    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在您的 session 中,您可以使用:
    ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

    What the default date format is?



    DATE没有格式,这个问题没有意义。相反,如果我们问:

    What is the default NLS_DATE_FORMAT session parameter that Oracle uses to convert between strings and dates?



    这取决于 NLS_TERRITORY session 参数(因此这取决于您在世界上的位置):
    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

    关于sql - Oracle 的默认 DATE 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50163432/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com