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 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 :
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!