1

私はDrupal7、PHP、およびMySQLを使用しており、MySQLデータベースからクエリを実行するときにタイムゾーンの問題に頭を悩ませようとしています。

Drupalは、ゲートからかなり離れた日付を処理します。すべての日付は、データベースにUTCタイムスタンプintとして保存され、タイムゾーン変換は、PHP 5の組み込みタイムゾーン機能を使用して、各ユーザープロファイルのタイムゾーン設定を介してユーザーごとに行われます(したがって、PHPスクリプトが実行されるたびに、スクリプトのタイムゾーンが現在のユーザーのタイムゾーンに設定されます。

したがって、PHPに固執する限り、これはすべて問題なく、ダンディで、かなり痛みがありません。

現在のPHPスクリプトのタイムゾーンを特定のMySQLクエリと完全に同期させる方法がないように思われるため、MySQLを導入すると、状況が複雑になり始めます。ベストプラクティスでは、PHPですべてのタイムゾーン変換を処理する必要があるようです。データベースに生のタイムスタンプをクエリし、必要に応じてPHPで変換するだけです。

これはほとんどの場合(時々少し遅い場合でも)合理的と思われますが、MySQL GROUP BY [日付]クエリで何をすべきでしょうか?たとえば、私は分析を処理するためのモジュールを構築しており、次のようなことを頻繁に実行したいと考えています。

GROUP BY YEAR(FROM_UNIXTIME(u.created)), MONTH(FROM_UNIXTIME(u.created))

そのため、タイムゾーンの問題が発生します...

頭に浮かんだ考えられる解決策:

  1. タイムゾーンをハードコーディングする:モジュール内でdate_default_timezone_set()を使用して、PHPタイムゾーンが常にシステムタイムゾーンに設定されるようにします(つまり、MySQLタイムゾーン= PHPタイムゾーン)。つまり、分析を表示しているユーザーのタイムゾーンを尊重するのではなく、分析のタイムゾーンがハードコーディングされます。複数のタイムゾーンのユーザーが自分のタイムゾーンを使用して分析にアクセスできるようにするため、これは実際には理想的ではありません。また、date_default_timezone_set()は、特定の関数内だけでなく、スクリプト全体のタイムゾーンを設定するため、Drupalを台無しにしているようです...

  2. クエリでGROUPBYを使用することを忘れてください。データベースからすべての生データをフェッチし(数万または数十万の行がある場合)、forループを使用してphpで日付ごとに結果をグループ化します...このソリューションは次のようになります大幅にリソースを消費し、速度が遅く、ややばかげています。

だから私が求めているのは何かを逃したのだろうか?ここで私が知らないベストプラクティスはありますか?

助けてくれてありがとう!

4

1 に答える 1

0

このようなアプローチを検討します

SET time_zone = '+02:00';

http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

そして持っている

GROUP BY FROM_UNIXTIME(u.created, '%Y-%m');

FROM_UNIXTIMEに基づいているのでtime_zone、これは望ましい結果を与えるはずです。

time_zone後で変更を元に戻すには、SELECT TIMEDIFF(NOW(), CONVERT_TZ(now(), @@session.time_zone, '+00:00'));最初に保存してから、保存した値に設定することを検討してください。

于 2013-02-06T09:52:16.717 に答える