私は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))
そのため、タイムゾーンの問題が発生します...
頭に浮かんだ考えられる解決策:
タイムゾーンをハードコーディングする:モジュール内でdate_default_timezone_set()を使用して、PHPタイムゾーンが常にシステムタイムゾーンに設定されるようにします(つまり、MySQLタイムゾーン= PHPタイムゾーン)。つまり、分析を表示しているユーザーのタイムゾーンを尊重するのではなく、分析のタイムゾーンがハードコーディングされます。複数のタイムゾーンのユーザーが自分のタイムゾーンを使用して分析にアクセスできるようにするため、これは実際には理想的ではありません。また、date_default_timezone_set()は、特定の関数内だけでなく、スクリプト全体のタイムゾーンを設定するため、Drupalを台無しにしているようです...
クエリでGROUPBYを使用することを忘れてください。データベースからすべての生データをフェッチし(数万または数十万の行がある場合)、forループを使用してphpで日付ごとに結果をグループ化します...このソリューションは次のようになります大幅にリソースを消費し、速度が遅く、ややばかげています。
だから私が求めているのは何かを逃したのだろうか?ここで私が知らないベストプラクティスはありますか?
助けてくれてありがとう!