MSSQL / dblib的PDO日期时间格式

时间:2011-11-25 08:55:52

标签: php sql sql-server-2005 datetime pdo

MSSQL 2005数据库具有排序规则“German_Phonebook_BIN”(但这并不重要)。通过PDO和FreeTDS(在Debian Squeeze下使用PHP)完成与db的连接。当我尝试从表中选择日期时间值时,我得到如下结果:

2008年4月1日12:00:00:000

但我希望得到

2008-01-01 00:00:00

(注意,那时间00:00:00转换为12:00:00,不知道为什么00:00 = 12:00 ???) 我无法操纵SELECT语句(使用CONVERT进行转换)。我在PDO中找不到设置日期格式的选项。查询运行之前的SET DATEFORMATSET LANGUAGE也不会影响这一点。 任何人都可以提示在PDO中可以完成(并且只能完成)吗? (顺便说一下,PEAR :: MBD2以预期的格式返回datetime列,但是当它必须与UTF-8和MSSQL一起使用时,MDB2非常糟糕)

好的,更多信息(仅显示重要的片段):

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

3 个答案:

答案 0 :(得分:6)

检查/etc/freetds/locales.conf中的设置或FREETDSCONF指向的位置 - 例如,请参阅https://www.centos.org/modules/newbb/viewtopic.php?topic_id=29646

另一种选择可能是使用convert in your SQL statement ...

答案 1 :(得分:3)

我发现将PHP PDO_DBLIB与SQLSRV一起使用的最佳方法是将日期作为datetime2(6)存储在MS SQL SERVER DB中。无论如何,在使用symfony框架时似乎解决了很多问题。

答案 2 :(得分:0)

我也有这个问题,并且发现由于某些原因我让freetds应用freetds.conf中的设置(而不是仅使用我的连接器字符串中的完整主机名),日期显示正确。

例如,如果我使用:

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

...然后它没有按预期工作 - 日期很古怪。但如果我用过:

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

...然后DID工作,因为它在我的freetds.conf文件中找到了“myhost”。

我的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