J'ai une base de données Oracle avec un timestamp
champ dedans. Quel est le code SQL correct pour insérer un timestamp
dans ce champ?
J'ai une base de données Oracle avec un timestamp
champ dedans. Quel est le code SQL correct pour insérer un timestamp
dans ce champ?
Réponses:
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));
si vous voulez que l'horodatage actuel soit inséré, alors:
insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);
TO_DATE
au lieu de TO_TIMESTAMP
?
INSERT
instruction, mais en général, vous ne voulez pas utiliser de variables de liaison comme celle-ci. La conversion de type dans votre première instruction l'empêche d'être sensible à la liaison, ce qui limite la capacité d'Oracle à créer de bons plans. L'optimiseur peut fonctionner mieux si vous l'utilisez à la values (:ts_val)
place, en supposant que: ts_val mappe directement sur un horodatage.
to_timestamp
entraînerait un mauvais plan d'exécution pour une instruction SQL planifiable? Je peux montrer un exemple de la façon dont ce ne serait pas le cas. Au lieu de cela, je pense que nous voulons tous éviter une contrainte de type de données inattendue qui empêche l'utilisation d'une opération de source de ligne attendue (c'est-à-dire, celle optimale).
Cela dépend de l'origine de la valeur que vous souhaitez insérer. Si vous souhaitez insérer l'heure actuelle, vous pouvez l'utiliser CURRENT_TIMESTAMP
comme indiqué dans d'autres réponses (ou SYSTIMESTAMP
).
Si vous avez une heure sous forme de chaîne et que vous souhaitez la convertir en horodatage, utilisez une expression telle que
to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')
Les composants du format de l'heure sont, je l'espère, explicites, sauf que FF3
signifie 3 chiffres de précision inférieure à la seconde. Vous pouvez aller jusqu'à 6 chiffres de précision.
Si vous effectuez une insertion depuis une application, la meilleure réponse peut dépendre de la manière dont la valeur de date / heure est stockée dans votre langue. Par exemple, vous pouvez mapper certains objets Java directement sur une TIMESTAMP
colonne, mais vous devez comprendre les JDBC
mappages de types.
Je préfère les littéraux d'horodatage ANSI:
insert into the_table
(the_timestamp_column)
values
(timestamp '2017-10-12 21:22:23');
Plus de détails dans le manuel: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062
timestamp '2019-05-16 10:05:51:19:277401'
j'ai cette erreur: ORA-01882: région du fuseau horaire introuvable
Insertion de la date dans SQL
insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');
Si nous voulons insérer la date système
insert
into tablename (timestamp_value)
values (sysdate);
Tout d'abord, vous devez rendre le champ Nullable, puis après cela si simple - au lieu de mettre une valeur, mettez ce code CURRENT_TIMESTAMP
.
Pour ma propre référence future:
Avec cx_Oracle, utilisez cursor.setinputsize (...):
mycursor = connection.cursor();
mycursor.setinputsize( mytimestamp=cx_Oracle.TIMESTAMP );
params = { 'mytimestamp': timestampVar };
cusrsor.execute("INSERT INTO mytable (timestamp_field9 VALUES(:mytimestamp)", params);
Aucune conversion nécessaire dans la base de données. Voir la documentation Oracle
On peut simplement utiliser
INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');
De cette façon, vous n'aurez pas à vous soucier de la chaîne de format de date, utilisez simplement le format d'horodatage par défaut.
Fonctionne avec Oracle 11, je ne sais pas si c'est le cas pour les versions antérieures d'Oracle.