web-dev-qa-db-fra.com

Comment changer le format de date de MM/JJ/AAAA en AAAA-MM-JJ en PL/SQL?

J'ai une colonne de date dans une table stockée au format MM/DD/YYYY. Je dois sélectionner et stocker la même date dans une autre table au format YYYY-MM-DD, à savoir le format de date XSD. Mais je ne suis pas capable de le faire. J'utilise cette requête:

select to_date(date_column,'YYYY-MM-DD') from table;

Mais je ne suis toujours pas capable de le faire. Me donner l'erreur 

ORA-01843: mois non valide

15
user972548

utilisation

select to_char(date_column,'YYYY-MM-DD') from table;
55
Yahia

On dirait que vous l'avez mal compris. Si vos données existantes sont au format MM/JJ/AAAA, vous souhaitez:

select to_date(date_column,'MM/DD/YYYY') from table;

convertir les données existantes en valeurs DATE. (Je me demande pourquoi ils ne sont pas stockés sous forme de dates, pour être honnête ...)

Si vous souhaitez effectuer la conversion en une étape, vous souhaiterez peut-être:

select to_char(to_date(date_column,'MM/DD/YYYY'), 'YYYY-MM-DD') from table;

En d'autres termes, pour chaque ligne, analysez-la au format MM/JJ/AAAA, puis reformatez-la au format AAAA-MM-JJ.

(Je suggérerais quand même d'essayer de conserver les données dans leur type "naturel" cependant, plutôt que de les stocker sous forme de texte en premier lieu.)

12
Jon Skeet

Je suppose que vous pouvez utiliser Oracle SQL Developer, que vous pouvez télécharger depuis ici .

Vous pouvez définir le format de date avec lequel vous souhaitez travailler:

ALTER SESSION SET nls_date_format='yyyy-mm-dd';

Avec cela, vous pouvez maintenant effectuer une requête comme celle-ci:

SELECT * FROM emp_company WHERE JDate = '2014-02-25'

Si vous voulez être plus précis, vous pouvez définir le format de date comme ceci:

ALTER SESSION SET nls_date_format='yyyy-mm-dd hh24:mi:ss';
5
Jorge E. Hernández
select to_date(to_char(ORDER_DATE,'YYYY/MM/DD')) 
from ORDERS;

Cela pourrait aider mais, à la fin, vous obtiendrez une chaîne et non la date. Apparemment, votre problème de format sera résolu à coup sûr.

3
user9338150

Pour convertir une colonne DATE dans un autre format, utilisez simplement TO_CHAR() avec le format souhaité, puis reconvertissez-la en un type DATE:

SELECT TO_DATE(TO_CHAR(date_column, 'DD-MM-YYYY'), 'DD-MM-YYYY') from my_table
3
Phate01

Cela a fonctionné pour moi! Vous pouvez convertir en type de données que vous voulez soit une date ou une chaîne

to_char(TO_DATE(TO_CHAR(end_date),'MM-DD-YYYY'),'YYYY-MM-DD') AS end_date
2

Selon les commentaires, le type de données dans le datatable est DATE . Vous devriez donc simplement utiliser: "Select date_column from table;"

Maintenant, si vous exécutez la sélection, vous récupérerez un type de données de date, qui devrait correspondre à ce dont vous avez besoin pour .xsd.

Le formatage de la date dépendant de la culture doit être effectué dans l'interface graphique (la plupart des langues disposent de moyens pratiques de le faire), et non dans l'instruction select.

1
Johannes

Fondamentalement, les données d'une colonne Date dans Oracle peuvent être stockées dans n'importe quel format défini par l'utilisateur ou conservées par défaut .. .. Tout dépend du paramètre NLS.

Le format actuel peut être vu par: SELECT SYSDATE FROM DUAL; 

Si vous essayez d'insérer un enregistrement et que l'instruction n'est PAS dans CE format, il générera: ORA-01843: erreur de mois non valide . Commencez donc par modifier le format de la date de la base de données vous avez un chargement en bloc d’instructions d’insertion), puis exécutez le script d’insertion.

Le format peut être modifié de la manière suivante: ALTER SESSION SET nls_date_format = 'mm/jj/aaaa hh24: mi: ss'; 

Vous pouvez également modifier les paramètres NLS à partir de l'interface graphique du développeur SQL (Outils> préférences> Base de données> NLS).

Réf: http://Oracle.ittoolbox.com/groups/technical-functional/Oracle-sql-l/how-to-view-current-date-format-1992815

1
supernova

Pour le formatage de l'heure militaire, 

select TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mm:ss') from DUAL

--2018-07-10 15:07:15

Si vous voulez que votre date arrondisse au mois, jour, heure, minute, vous pouvez essayer

SELECT TO_CHAR( SYSDATE, 'yyyy-mm-dd hh24:mi:ss') "full-date" --2018-07-11 10:40:26
, TO_CHAR( TRUNC(SYSDATE, 'year'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-year"-- 2018-01-01 00:00:00
, TO_CHAR( TRUNC(SYSDATE, 'month'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-month" -- 2018-07-01 00:00:00
, TO_CHAR( TRUNC(SYSDATE, 'day'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-Sunday" -- 2018-07-08 00:00:00
, TO_CHAR( TRUNC(SYSDATE, 'dd'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-day" -- 2018-07-11 00:00:00
, TO_CHAR( TRUNC(SYSDATE, 'hh'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-hour" -- 2018-07-11 10:00:00
, TO_CHAR( TRUNC(SYSDATE, 'mi'), 'yyyy-mm-dd hh24:mi:ss') "trunc-to-minute" -- 2018-07-11 10:40:00
from DUAL

Pour les littéraux de formats, vous trouverez de l'aide dans https://docs.Oracle.com/cd/B28359_01/server.111/b28286/functions242.htm#SQLRF52037

1
Jenna Leaf