web-dev-qa-db-fra.com

ORA-01810: le code de format apparaît deux fois

Pourquoi le SQL ci-dessous génère-t-il une erreur ORA-01810? J'ai recherché l'erreur et j'utilise différents formats de date pour chaque insertion de date

INSERT INTO bag_grte_clm
(
    schd_dprt_ldt,
    arr_trpn_stn_cd,
    bkg_crtn_gdt,
    sbmt_bag_grte_clm_dt,
    bag_grte_clm_stt_cd,
    lst_updt_gts,
    bag_grte_clm_gts,
    dprt_trpn_stn_cd
)
VALUES (
    TO_DATE('2015/12/06', 'yyyy/mm/dd'),
    'YUL',
    TO_DATE('2015-11-15', 'yyyy-mm-dd'),
    TO_DATE('120615', 'MMDDYY'),
    'DENIAL',
    (current_timestamp),
    TO_TIMESTAMP('20151206 00:00:00', 'yyyymmdd hh:mm:ss'),
    'ATL'
) 
19
LedMan1001

TO_TIMESTAMP ('20151206 00:00:00', 'aaaammjjh hh: mm: ss')

C'est faux de deux manières:

1. Code de format incorrect

Vous avez répété le masque de formatage MM deux fois. MM est mois et MI est minutes.

 SQL> SELECT TO_TIMESTAMP ('20151206 00:00:00', 'aaaammjj hh: mm: ss') FROM dual; 
 SELECT TO_TIMESTAMP ('20151206 00:00:00', 'yyyymnjjd hh: mm: ss) FROM dual 
 * 
 ERREUR à la ligne 1: 
 ORA-01810: le code de formatage apparaît deux fois 

2. Portion de temps incorrecte

00:00:00 est faux car il jetterait ORA-01849 puisque l'heure ne peut être nulle, elle doit être comprise entre 1 et 12 .

 SQL> SELECT TO_TIMESTAMP ('20151206 00:00:00', 'aaaammjj hh: mi: ss') FROM dual; 
 SELECT TO_TIMESTAMP ('20151206 00:00:00', 'aaaammjjd hh: mi: ss) FROM dual 
 * 
 ERREUR à la ligne 1: 
 ORA-01849: heure doit être comprise entre 1 et 12 

La méthode correcte consiste à utiliser le format 24 heures ou à laisser la partie heure qui, par défaut, serait 12 AM.

Par exemple,

format 24 heures:

SQL> SELECT  TO_TIMESTAMP('20151206 00:00:00', 'yyyymmdd hh24:mi:ss') my_tmstamp FROM dual;

MY_TMSTAMP
---------------------------------------------------------------------------
06-DEC-15 12.00.00.000000000 AM

pas de tranche de temps:

SQL> SELECT  TO_TIMESTAMP('20151206', 'yyyymmdd') my_tmstamp FROM dual;

MY_TMSTAMP
-----------------------------------------------------------------------
06-DEC-15 12.00.00.000000000 AM
43
Lalit Kumar B

Vous avez utilisé le code de format mm deux fois dans TO_TIMESTAMP('20151206 00:00:00', 'yyyymmdd hh:mm:ss')

MM est pour mois
MI est pour minute
Vous vouliez probablement utiliser YYYYMMDD HH:MI:SS.

Veuillez consulter la liste des modèles de format de date pour plus d'informations.

12
Mr. Llama