Formato datetime PDO per MSSQL / dblib

Il database MSSQL 2005 ha regole di confronto "German_Phonebook_BIN" (ma non è importnte). La connessione a db avviene tramite PDO e FreeTDS (usando PHP sotto Debian Squeeze). Quando provo a select i valori datetime da una tabella ottengo risultati come:

1 aprile 2008 12: 00: 00: 000

Ma mi aspetto di get

2008-01-01 00:00:00

(Considerare che l'ora 00:00:00 viene trasformata in 12:00:00, non so perché 00: 00 = 12: 00 ???) Non c'è modo per me di manipolare le istruzioni SELECT (per fare una conversione con CONVERT ). Non ho trovato alcuna opzione in PDO per l'impostazione di un formato di data. SET DATEFORMAT e SET LANGUAGE prima SET LANGUAGE della query non influiscono anche su questo. Qualcuno può dare un suggerimento in cui ciò può essere fatto (e fatto solo) in DOP? (Btw. PEAR :: MBD2 restituisce colonne datetime nel formato previsto, ma MDB2 è orribile quando deve funzionare con UTF-8 e MSSQL)

OK, qualche altra informazione (mostra solo frammenti importnti):

 <?php $this->_dsn = 'dblib:host=' . $this->_db['host'] . ';dbname=' . $this->_db['database'] . ';charset=UTF-8'; $this->_handle = new PDO($this->_dsn, $this->_db['user'], $this->_db['password']); print_r($this->_handle->query("SELECT [date_column] FROM [some_table]")); 

controlla le impostazioni in /etc/freetds/locales.conf o ovunque FREETDSCONF punti – per un esempio vedi https://www.centos.org/modules/newbb/viewtopic.php?topic_id=29646 .

Un'altra opzione potrebbe essere quella di utilizzare la convert nell'istruzione SQL …

Trovo il modo migliore per utilizzare PHP_PDO_DBLIB con SQL SRV è quello di memorizzare le date come datetime2 (6) nel database MS SQL SERVER. Sembra che risolva un sacco di problemi quando si usa comunque il framework symfony.

Ho avuto anche questo problema e ho scoperto che, per qualche motivo, quando permettevo ai freetd di applicare le impostazioni da freetds.conf (invece di usare solo il nome host completo nella mia string di connettore), le date apparivano correttamente.

Ad esempio, se ho usato:

 $link = new PDO("dblib:host=myhost.myfulldomain.com;dbname=MYDB", $user, $pass); 

… poi NON ha funzionato come previsto – le date erano pazzesche. Ma se io usassi:

 $link = new PDO("dblib:host=myhost;dbname=MYDB", $user, $pass); 

… poi ha funzionato perché ha trovato "myhost" nel mio file freetds.conf.

Il mio file freetds.conf:

 # $Id: freetds.conf,v 1.12 2007/12/25 06:02:36 jklowden Exp $ # # This file is installed by FreeTDS if no file by the same # name is found in the installation directory. # # For information about the layout of this file and its settings, # see the freetds.conf manpage "man freetds.conf". # Global settings are overridden by those in a database # server specific section [global] # TDS protocol version ; tds version = 4.2 # Whether to write a TDSDUMP file for diagnostic purposes # (setting this to /tmp is insecure on a multi-user system) ; dump file = /tmp/freetds.log ; debug flags = 0xffff # Command and connection timeouts ; timeout = 10 ; connect timeout = 10 # If you get out-of-memory errors, it may mean that your client # is trying to allocate a huge buffer for a TEXT field. # Try setting 'text size' to a more reasonable limit text size = 5242880 # A typical Sybase server [egServer50] host = symachine.domain.com port = 5000 tds version = 5.0 # My MS SQL server [myhost] host = myhost.mydomain.com port = 1433 tds version = 8.0