2009-07-03 9 views
0

J'interroge une base de données mssql 2008 via odbc et stublé sur un comportement étrange.Mauvaise date de liaison PDO

Le code suivant est utilisé ...

$datefrom = "2009-06-01"; 
$dateto = "2009-07-01"; 
$clientno = "01"; 
$sth = $db->prepare("select count(*) from tbl WHERE v_valid_from <= ? and valid_from <= ? and (v_invalid_from >= ?) and (valid_to >= ? or valid_to is null) and clientno = ?"); 
$sth->execute(array($datefrom, $datefrom, $dateto, $dateto, $clientno)); 

la requête récupère 80 lignes si 1000 étaient attendus.

En regardant dans le profileur, le serveur exécute l'instruction suivante:

select count(*) from tbl 
WHERE v_valid_from <= '20090601 00:00:00.000' and valid_from <= '20090601 00:00:00.000' and 
(v_invalid_from >= '20090701 00:00:00.000') and (valid_to >= '20090701 00:00:00.000' or valid_to is null) and clientno = '01' 

quand je mets « - » dans les dates, la requête est exécutée correctement.

Il ne semble pas y avoir de liaison spéciale pour les valeurs datetime, donc je me demande pourquoi cela se produit.

Les paramètres de session sont les suivantes:

set quoted_identifier on 
set arithabort off 
set numeric_roundabort off 
set ansi_warnings on 
set ansi_padding on 
set ansi_nulls on 
set concat_null_yields_null on 
set cursor_close_on_commit off 
set implicit_transactions off 
set language English 
set dateformat ymd 
set datefirst 1 
set transaction isolation level read committed 

Répondre

0

Je n'ai pas assez de représentant pour commenter. Que se passe-t-il si vous changez le '-' en '/' lorsque vous définissez les valeurs de date au début? Par exemple:

$datefrom = "2009/06/01"; 
$dateto = "2009/07/01";