2009-12-08 6 views
0

J'utilise Perl DBD::ODBC pour me connecter à une base de données Oracle. Toutefois, un problème se pose lorsque j'essaie d'exécuter une requête select en utilisant une date dans la clause where. Il semble que ce problème se produit en raison du format de date de la base de données étant DD-MON-RR (voir DBD::ODBC::FAQ). Puisque je ne peux pas changer les paramètres de la base de données, quelqu'un peut-il suggérer une solution de contournement?Perl DBD :: ODBC Problèmes avec les formats de date Oracle

Répondre

4

La base de données par défaut date le format de date n'a d'importance que si vous en dépendez, ce qui n'est pas le cas en général. Vous pouvez:

1) Spécifiez le format de la date dans votre requête:

select * 
from news 
where news_date = to_date ('01-DEC-2009','DD-MON-RRRR'); 

2) Utilisez la norme ANSI pour la date littéraux:

select * 
from news 
where news_date = DATE '2009-12-01'; 
1

Ne vous fiez pas implicite datatype conversion. Vous pouvez toujours spécifier le format de date dans la clause où:

WHERE your_column = to_date(:your_parameter, 'yyyy/mm/dd') 
2

Une option est d'utiliser la fonction (ou ANSI 'DATE' mot-clé) TO_DATE() pour convertir le format dans toutes les requêtes:

WHERE date_field > TO_DATE('2009-11-01', 'YYYY-MM-DD'); 
-- or 
WHERE date_field > DATE '2009-11-01' 

Si vous devez faire beaucoup, une meilleure option serait de définir le format de la session:

$dbh->do("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"); 
$dbh->do("ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SSxFF'"); 
$dbh->do("ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SSxFF'"); 

Puis:

my $sth = $dbh->prepare(<<EOT); 
SELECT date_field 
FROM some_table 
WHERE date_field > '2009-11-01' 
EOT 
Questions connexes