2011-11-25 17 views
10

La base de datos de MSSQL 2005 tiene la intercalación "German_Phonebook_BIN" (pero eso no es importante). La conexión a db se realiza a través de PDO y FreeTDS (usando PHP bajo Debian Squeeze). Cuando trato de seleccionar valores de fecha y hora de una tabla consigo resultados como:Formato de fecha y hora de PDO para MSSQL/dblib

Abr 1 2008 12: 00: 00: 000

Pero espero obtener

2008-01-01 00:00 : 00

(Tenga en cuenta que el tiempo 00:00:00 se transforma en 12:00:00, no sé por qué 00: 00 = 12: 00 ???) No hay forma de que yo pueda manipular las declaraciones SELECT (para hacer una conversión con CONVERT). No encontré ninguna opción en PDO para establecer un formato de fecha. SET DATEFORMAT y SET LANGUAGE antes de que se ejecute la consulta, esto tampoco afecta. ¿Alguien puede dar una pista de dónde se puede hacer esto (y solo se puede hacer) en PDO? (. Por cierto PEAR :: MBD2 devuelve columnas de fecha y hora en el formato esperado, pero MDB2 es horrible cuando se tiene que trabajar con UTF-8 y MSSQL)

bien, algo más de información (muestra sólo fragmentos importantes):

<?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]")); 
+0

Este comportamiento no es normal. ¿Puede mostrar cómo selecciona esos valores y cómo los genera en PHP? –

+1

Eche un vistazo a https://bugs.php.net/bug.php?id=54648 – rabudde

+0

ugh, ya veo. --- –

Respuesta

3

Creo que la mejor manera de utilizar PHP_PDO_DBLIB con SRV SQL es almacenar fechas como datetime2 (6) en la base de datos MS SQL SERVER. Parece que resuelve muchos problemas cuando se usa el framework symfony de todos modos.

0

También tuve este problema, y ​​descubrí que por algún motivo cuando permitía que freetds aplicara la configuración de freetds.conf (en lugar de simplemente usar el nombre de host completo en la cadena de mi conector), las fechas aparecían correctamente.

Por ejemplo, si utilicé:

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

... entonces no funcionó como se esperaba - las fechas eran loco. Pero si he utilizado:

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

... entonces lo hizo el trabajo, ya que se encontró "myhost" en mi archivo freetds.conf.

Mi archivo 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 
Cuestiones relacionadas