web-dev-qa-db-fra.com

Le format de date par défaut d’Oracle est AAAA-MM-JJ, POURQUOI?

Le format de date par défaut d’Oracle est AAAA-MM-JJ. Ce qui signifie si je le fais:

 select some_date from some_table

... je perdre la partie heure de ma date.

Oui, je sais que vous pouvez "réparer" ceci avec:

 alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Mais sérieusement, pourquoi ce qui précède n'est-il pas la valeur par défaut? En particulier dans un SGBD où les deux types de données de suivi temporel principaux (DATE et TIMESTAMP) les deux ont une composante temporelle qui inclut (au moins) une précision allant jusqu'à 1 seconde.

67
Aaron Fi

Si vous utilisez cette requête pour générer un fichier d'entrée pour votre entrepôt de données, vous devez formater les données de manière appropriée. Essentiellement, dans ce cas, vous convertissez la date (qui a une composante heure) en chaîne. Vous devez formater explicitement votre chaîne ou modifier votre nls_date_format pour définir la valeur par défaut. Dans votre requête, vous pouvez simplement faire:

select to_char(some_date, 'yyyy-mm-dd hh24:mi:ss') my_date
  from some_table;
54
Doug Porter

Êtes-vous sûr de ne pas confondre la base de données Oracle avec Oracle SQL Developer?

La base de données elle-même n'a pas de format de date, la date sort de la base de données sous forme brute. C'est au logiciel client de le restituer, et SQL Developer ne utilise AAAA-MM-JJ comme format par défaut, ce qui est presque inutile, je suis d'accord.

edit: Comme cela a été commenté ci-dessous, SQL Developer peut être reconfiguré pour afficher correctement les valeurs de DATE, il a juste de mauvaises valeurs par défaut.

82
skaffman

Le format AAAA-MM-JJ fait partie de ISO8601 une norme pour l’échange d’informations de date (et d’heure).

C'est très courageux de la part d'Oracle d'adopter une norme ISO comme celle-ci, mais en même temps, étrangement, ils ne l'ont pas a fait tout le chemin .

En général, les gens résistent à tout ce qui est différent, mais il existe de nombreuses bonnes International raisons.

Je sais que je dis des choses révolutionnaires, mais nous devrions tous adopter les normes ISO, même si nous le faisons un peu à la fois .

21
pavium

Le plus gros PITA d'Oracle est qu'il n'a pas de format de date par défaut!

Dans votre installation d’Oracle, la combinaison de paramètres régionaux et d’installations a choisi (le plus raisonnable!) AAAA-MM-JJ comme format de sortie des dates. Une autre installation aurait pu choisir "JJ/MM/AAAA" ou "AAAA/JJ/MM".

Si vous voulez que votre SQL soit portable sur un autre site Oracle, je vous recommanderais toujours encapsulez une TO_CHAR(datecol,'YYYY-MM-DD') ou une fonction similaire autour de chaque colonne de date votre code SQL ou définissez le format par défaut immédiatement après votre connexion avec

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

ou similaire.

12
James Anderson

Il n’est jamais sage de s’appuyer sur les valeurs par défaut définies sur une valeur particulière, IMHO, que ce soit pour les formats de date, les formats de devise, les modes d’optimiseur ou autre. Vous devez toujours définir la valeur du format de date dont vous avez besoin, sur le serveur, le client ou l'application.

En particulier, ne vous fiez jamais aux valeurs par défaut lors de la conversion de types de données date ou numériques à des fins d'affichage, car une seule modification apportée à la base de données peut endommager votre application. Toujours utiliser un format de conversion explicite. Pendant des années, j'ai travaillé sur des systèmes Oracle où le format d'affichage de la date par défaut était MM/DD/RR, ce qui m'a rendu fou mais au moins m'a obligé à toujours utiliser une conversion explicite.

9
David Aldridge

La plupart des IDE vous permettent de configurer le masque par défaut pour certaines données, telles que la date, la devise, le séparateur décimal, etc.

Si vous utilisez Oracle SQL Developer:

Outil> Préférences> Base de données> NLS

Format de date: AAAA-MM-JJ HH24: MI: SS

7
Fabio Farath

C'est un "problème" côté client, pas vraiment un problème Oracle.

C'est l'application cliente qui formate et affiche la date de cette façon.

Dans votre cas, c'est SQL * Plus qui effectue ce formatage.
D'autres clients SQL ont d'autres valeurs par défaut.

5

La valeur DATE du standard SQL est AAAA-MM-JJ. Ainsi, même si Oracle stocke les informations de temps, je suppose qu’elles affichent la valeur d’une manière compatible avec le standard SQL. Dans la norme, le type de données TIMESTAMP comprend les informations de date et d'heure.

4
Harold L

Je ne suis pas un utilisateur Oracle (enfin, ces derniers temps en tout cas), MAIS ...

Dans la plupart des bases de données (et dans un langage précis), une date n'inclut pas une heure. Avoir une date ne signifie pas que vous dénotez une seconde spécifique à cette date. Généralement, si vous voulez une heure et une date, cela s'appelle un horodatage.

2
Nick Bastin

Oracle a les types de données Date et Timestamp.

Selon documentation Oracle , il existe des différences de taille des données entre Date et Horodatage. Par conséquent, lorsque vous souhaitez définir un champ Date uniquement, il est judicieux d’afficher le formatage Date. En outre, "il n'a pas de fractions de secondes ou un fuseau horaire." - Ce n'est donc pas le meilleur choix lorsque des informations d'horodatage sont requises.

Le champ Date peut être facilement formaté pour afficher le composant heure dans Oracle SQL Developer - la requête de date exécutée dans PL/SQL Developer indique l'heure, mais ne s'affiche pas dans Oracle SQL Developer . Mais il ne montrera pas les secondes ni le fuseau horaire - vous avez besoin du type de données Timestamp pour cela.

1
razvanone

raison: si vous consultez une colonne de données avec un horodatage, le bit d'informations _MOST_IMPORTANT_ correspond à l'année. Si les données sont dans la base de données depuis dix ans, il est important de savoir. alors l'année vient en premier.

il est logique que ce mois vienne ensuite, puis jour, heure, minute. Objectivement, il s'agit de la séquence la plus logique pour l'affichage des données temporelles.

il est également logique que si vous souhaitez afficher les données par défaut, vous ne devez afficher que la partie la plus significative des données, donc par défaut, uniquement Y-M-D. tout le reste PEUT être affiché, mais il n'encombre pas votre rapport SQL par défaut.

Le classement par date est logique si vous affichez Y-M-D car il est séquentiel. Les ordinateurs fonctionnent bien en mode séquentiel et cela semble logique.

enfin. Votre parti pris de vouloir M-D-Y est votre parti pris. Même aux États-Unis, tout le monde n'utilise pas ce format. Utilisez donc le format le plus logique et ne soyez pas indigné par les autres lorsque vous décidez d'être logique par défaut.

(Je suis né aux États-Unis et je ne représente pas Oracle. Je peux cependant penser par moi-même)

1
hollington