Maison >base de données >tutoriel mysql >Quel est le format de date par défaut dans Oracle et pourquoi est-il incohérent ?

Quel est le format de date par défaut dans Oracle et pourquoi est-il incohérent ?

DDD
DDDoriginal
2025-01-16 16:36:09929parcourir

What's the Default Date Format in Oracle and Why is it Inconsistent?

Quel est le format de date par défaut dans la base de données Oracle ?

Bien que la documentation spécifie une variété de formats de date par défaut, il n'existe en réalité aucun format fixe pour les dates Oracle. Ils sont stockés dans un format interne de 7 octets, représentant l'année (2 octets), le mois, le jour, l'heure, les minutes et les secondes (1 octet chacun).

Pourquoi y a-t-il tant d’informations contradictoires ?

Cela est dû au paramètre de session NLS_DATE_FORMAT. Ce paramètre sert de format par défaut et varie en fonction des paramètres régionaux de l'utilisateur. Par conséquent, des incohérences de format peuvent survenir lorsque les utilisateurs effectuent des conversions explicites de chaîne en date ou des conversions implicites. Oracle, lors de la conversion implicite de chaîne en date, tente d'interpréter la chaîne en fonction du paramètre NLS_DATE_FORMAT, provoquant des incohérences.

Pratiques recommandées

Pour éviter toute confusion, l'approche suivante est recommandée :

  • Date littérale : DATE '2018-01-25'
  • Horodatage littéral : TIMESTAMP '2018-01-25 01:23:45'
  • Conversion TO_DATE explicite : TO_DATE('25-JUN-18', 'DD-MON-RR')

Modifier NLS_DATE_FORMAT

Pour modifier le NLS_DATE_FORMAT dans une session, utilisez la commande suivante :

<code class="language-sql">ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';</code>

Valeur par défaut de NLS_DATE_FORMAT

La valeur par défaut de NLS_DATE_FORMAT dépend du paramètre de session NLS_TERRITORY, qui représente les paramètres régionaux de l'utilisateur. Pour voir quels formats sont utilisés dans différentes régions, exécutez la requête suivante :

<code class="language-sql">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 f.format 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;</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn