2017-10-13 5 views
0

J'ai un nom de table sur oracle 12c dont le nom de colonne est "TIMESTAMP (6) WITH TIME ZONE". J'utilise SQL Developer.Erreur "AM/A.M ou PM/PM requise" si AM est utilisé

Lorsque je sélectionne quelque chose de ce nom_colonne1 en utilisant SQL Developer, je vois la date comme: 19-SEP-17 03.19.55.000000000 PM +00:00 qui est en UTC.

Si j'utilise le même format dans mon SQL et le donne comme chaîne dans la clause where cela fonctionne bien. Exemple:

select column_name1 from table_name where column_name1 = '19-SEP-17 03.19.55.000000000 PM +00:00'; 

Mais je sais qu'il est recommandé de convertir la chaîne à ce jour dans des situations comme celle-ci. Donc quand j'essaye de faire cela en utilisant TO_TIMESTAMP, je n'arrive pas à trouver le bon format à ajouter dans le SQL.

Ce que j'ai essayé est:

select column_name1 from table_name where column_name1 = TO_TIMESTAMP('19-SEP-17 03.19.55.000000000 PM +00:00', 'DD-MON-YYYY HH:MI:SS.FF A.M. TZH:TZM'); 

Et même si AM/PM est déjà là, je reçois encore erreur: AM/A.M. or PM/P.M. required

J'ai essayé d'ajouter 'nls_date_language = américain' et mais toujours avoir la même erreur.

Qu'est-ce qui me manque ici? Comment puis-je changer le format TO_TIMESTAMP afin que je puisse convertir cette chaîne en TIMESTAMP?

Répondre

3

Utilisez-vous réellement TO_TIMESTAMP_TZ - comme vous le devriez, étant donné que la colonne est horodatée WITH TIME ZONE, et que la chaîne d'entrée et le modèle de format sont tous les deux pour timestamp WITH TIME ZONE? (Si vous utilisiez TO_TIMESTAMP comme cela vous obtiendrez une erreur différente, quelque chose comme "format de date non reconnu" - puisque vous ne pouvez pas avoir des éléments de format fuseau horaire dans le modèle de format pour un timestamp SANS timezone).

En supposant que ce soit le cas: Le problème est dû au passage de PM (sans points) dans la chaîne d'entrée, mais ayant A.M. (avec des points) dans le modèle de format. Utilisez le même format dans les deux endroits - soit avec des points, soit sans eux, mais soyez cohérent.

Dans certains endroits, Oracle ne se préoccupe pas des séparateurs incompatibles, mais dans ce cas, il le fait. Si vous le souhaitez, vous pouvez parcourir la documentation pour savoir exactement quelles substitutions Oracle tentera; mais cela ressemble à un exercice académique. Juste être cohérent entre la chaîne d'entrée et le modèle de format et vous n'aurez aucun problème.

+0

Merci pour la réponse et désolé de vérifier cela très tard. J'ai fini par changer le format d'affichage d'horodatage par défaut dans Oracle SQL Developer et l'ai changé en "YYYY-MM-DD HH24.MI.SSXFF" et pour l'horodatage avec le fuseau horaire "YYYY-MM-DD HH24.MI.SSXFF TZR". Je l'ai fait à partir des outils -> préférences -> Base de données -> NLS – 300

+0

@ 300 - La plupart des développeurs préfèrent le format 24 heures (moins de confusion, moins de possibilités pour les règles ennuyeuses comme celui-ci). AM/PM serait utilisé pour les rapports «consommateurs» non technologiques. – mathguy