Cela n'a pas d'importance pour cette simple INSERTinstruction, 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.
Jon Heller
@JonHeller Pouvez-vous montrer un exemple spécifique de la façon dont l'utilisation to_timestampentraî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).
Jeff Holt
@ jeff6times7 Voir ce Gist pour une explication de la façon dont les variables de liaison non converties peuvent surpasser les variables de liaison converties. La différence n'a probablement d'importance que si les données sont biaisées. Avec les types de liaison natifs, Oracle peut mieux comprendre les données et effectuer de meilleures estimations en fonction des valeurs.
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_TIMESTAMPcomme 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
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 TIMESTAMPcolonne, mais vous devez comprendre les JDBCmappages de types.
Oracle 11. Champ défini comme TIMESTAMP (6) non NULL. En utilisant timestamp '2019-05-16 10:05:51:19:277401'j'ai cette erreur: ORA-01882: région du fuseau horaire introuvable
Réponses:
si vous voulez que l'horodatage actuel soit inséré, alors:
la source
TO_DATE
au lieu deTO_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 à lavalues (: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).CURRENT_TIMESTAMP
etSYSTIMESTAMP
sont des mots réservés à Oracle à cet effet. Ils sont l'analogue d'horodatage deSYSDATE
.la source
la source
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 (ouSYSTIMESTAMP
).Si vous avez une heure sous forme de chaîne et que vous souhaitez la convertir en horodatage, utilisez une expression telle que
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 lesJDBC
mappages de types.la source
Je préfère les littéraux d'horodatage ANSI:
Plus de détails dans le manuel: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062
la source
timestamp '2019-05-16 10:05:51:19:277401'
j'ai cette erreur: ORA-01882: région du fuseau horaire introuvableInsertion de la date dans SQL
Si nous voulons insérer la date système
la source
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
.la source
Pour ma propre référence future:
Avec cx_Oracle, utilisez cursor.setinputsize (...):
Aucune conversion nécessaire dans la base de données. Voir la documentation Oracle
la source
On peut simplement utiliser
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.
la source
cela fonctionne pour mssql 2012
la source