2009-12-12 7 views
4

J'utilise Zend_Db pour interroger une table. J'ai quelques clauses WHERE qui doivent être des dates et il n'est pas clair (au premier coup d'oeil) comment faire ceci "la bonne manière". Est-ce que Zend_Db fournit une abstraction, donc je n'ai pas besoin de me préoccuper de la façon dont le backend (Oracle, MySQL, etc.) attend ses dates? Ou ai-je besoin de formater les choses de la façon dont mon backend les attend.Zend_Db et les requêtes basées sur la date

J'essaie la suit avec une base de données (PO_DATE est un champ d'horodatage)

$table = $this->getDbTable();    
$select = $table->select()->where('1 = ?', 1);  
$select->where('PO_DATE = ?', '2009-12-02'); 

et je reçois l'exception suivante

<b>Message:</b> 1843 ORA-01843: not a valid month SELECT "TABLE_NAME".* FROM "SYSTEM"."TABLE_NAME" WHERE (1 = 1) AND (PO_DATE = *'2009-12-02') </p> 

base Oracle Je me rends compte que je pouvais faire quelque chose comme ça

$date = new Zend_Db_Expr(
"to_date('2009-12-02', 'YYYY-MM-DD')" 
); 
$select->where('PO_DATE = ?', $date); 

mais cela me lie aux expressions basées sur la date d'Oracle, qui partiellement défait le but de l'utilisation d'une couche d'abstraction SQL.

Existe-t-il un moyen générique de faire des requêtes de date indépendantes de l'implémentation dorsale avec Zend_Db?

Répondre

4

Je voudrais certainement une telle fonctionnalité, cependant, je n'en ai trouvé aucune dans le Zend Framework. Ce issue dans leur tracker me rend également assez confiant son pas encore là.

+0

GRACE pour me sauver une nuit de recherche de quelque chose qui n'est pas là :) –

+0

Voir aussi http://framework.zend.com/issues/browse/ZF-8538 qui a l'air d'être implémenté –

0

Basé sur le fait que je ne vois pas tout type de contrat

abstract class Zend_Db_Adapter_Abstract 

qui implique « convertir des dates dans un format universel » fonctionnalité, je suppose que la réponse à ma question est non, mais avec un On ne sait jamais grand cadre, et il semble que le genre de chose mûr pour une abstraction.

1

Beaucoup de fournisseurs DB (y compris Oracle) soutiendra ce format:

$table = $this->getDbTable();       
$select = $table->select()->where('1 = ?', 1);   
$select->where('PO_DATE = ?', '02-Dec-2009'); 

Je tendance à le faire jusqu'à ce qu'ils aient un meilleur support pour la date/conversion de chaîne en Zend_Db

Questions connexes