MSSQL/dblibのPDO日時フォーマット

MSSQL 2005データベースの照合順序は "German_Phonebook_BIN"ですが、それは重要ではありません。 dbへの接続は、PDOとFreeTDS(Debian Squeezeの下でPHPを使用)を介して行われます。テーブルからdatetime値を選択しようとすると、次のような結果が得られます。

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でこれを行うことができます(そして完了するだけでよい)ヒントを与えることができますか? (Btw。PEAR :: MBD2はdatetimeカラムを期待されたフォーマットで返しますが、UTF-8とMSSQLで動作する必要がある場合はMDB2がひどいです)

OK、いくつかの情報(重要なスニペットのみを表示):

<?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]"));
10
この動作は正常ではありません。これらの値の選択方法とPHPでの出力方法を表示できますか?
追加された 著者 Pekka 웃,
うーん、私は参照してください。 ---
追加された 著者 Pekka 웃,
これはPDOの「バグ」と思われますが、PDOはUTF-8でエンコードされたデータに最適です
追加された 著者 rabudde,

3 答え

/etc/freetds/locales.conf または https://www.centos.org/を参照してください。 modules/newbb/viewtopic.php?topic_id = 29646

もう一つの選択肢は、あなたのSQL文で convert を使うことです。 。

6
追加された
ロケールはトリックをしました、ありがとう
追加された 著者 rabudde,
私は重大な理由のために下落しました。リンクは今や死んでおり、残念ながらweb.archive.orgはページをアーカイブしていませんでした。ほぼ7年後に同じ問題を抱えている人物として、外部リンクを提供するのではなく、興味のある部分を答えに埋め込むことができれば、将来的に大きな助けになるでしょう。ありがとう
追加された 著者 MacK,

私は、SQLのSRVでPHP_PDO_DBLIBを使用する最良の方法は、datetime2(6)として日付をMS SQL SERVER DBに保存することです。とにかくsymfonyフレームワークを使用すると、多くの問題を解決するようです。

3
追加された

私はこの問題も抱えていて、何らかの理由で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);

...それは私の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
0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com