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 DATEFORMAT
和SET 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]"));
答案 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