2016-06-23 5 views
0

私は試しましたが、このシナリオでは成功しませんでした。ユーザータイムゾーンの日付を渡すことによって、データベースに最近のレコードを取得するにはどうすればよいですか?

実際のデータ値は、ユーザーのタイムゾーンの日付に基づいて保存されている、

ので、私は動的にデータベースから値をチェックして、取得するためにいくつかのパラメータを渡したいです。しかし問題はどのように私はmysqlクエリにユーザーの時間としてパラメータを渡すことができますか?

User1のレコードが10件ある場合は、ユーザーのタイムゾーンの日付に基づいて最近の過去1時間のレコードが必要です。

$select = db_select('{emp}', 'e'); 
$select -> addField('e', 'name', 'name'); 
$select -> addField('e', 'date', 'date'); 
$select -> condition('e.name', $name); 
$select->where('date >= DATE_SUB(NOW(), INTERVAL 1 HOUR)'); 
$select -> orderBy('e.date', 'DESC')->range(0,1); 
$subresult = $select -> execute()-> fetchObject(); 

このクエリでは、システム時間をとって、その場所でユーザーの時間をどのように渡すことができますか?

助けてくださいか?

+0

これはormまたはlibraryを使用していますか?必要に応じて、そのタグを追加します。 – Drew

+1

私たちはdrupalでこれを使用しています。 – RaMeSh

答えて

0

これを参照してください。 How to handle MySQL timezone in script

異なるタイムゾーンのユーザーに見えるように時刻データを保存するには、いくつかのことを行う必要があります。

まず、各ユーザーに自分のタイムゾーンを指定するよう依頼します。 These are specified as stringsは、'America/New_York'および'Asia/Dili'である。その情報を各ユーザーのプロファイルの一部として保管します。

次に、あなたのアプリケーションからMySQLへのアプリケーションからの接続を行うたびに、このようなコマンドで接続時間帯を設定します。

SET time_zone = users-time-zone-choice 

は最後に、常に、TIMESTAMPデータ型に時刻情報を保存しますDATEまたはDATETIMEデータ型ではありません。 TIMESTAMPの値は、格納時に常に現地時間からUTCに変換され、検索時に常に現地時間に変換されます。

したがって、timestamp_column >= NOW() - INTERVAL 2 HOURなどのクエリが正しく機能します。

datetime_column >= NOW() - INTERVAL 2 HOURは機能しません。

次に、NOW()の機能がユーザーの現地時間で表示されます。それで、TIMESTAMPのデータ項目の内容になります。 DATETIMEDATEオブジェクトの内容はではなく、ユーザーの現地時間でと表示されます。タイムゾーンに関係なく常に格納され、取得されます。

サーバーのデフォルトのタイムゾーンをUTCに設定することをお勧めします。

これを試すことができます。これらのコマンドはあなたに興味深い結果を与えるはずです。

set time_zone = 'Asia/Dili'; 
select @@time_zone, now(), utc_timestamp(); 
set time_zone = 'America/Phoenix'; 
select @@time_zone, now(), utc_timestamp(); 
set time_zone = 'Asia/Jerusalem'; 
select @@time_zone, now(), utc_timestamp(); 
+0

タイムゾーンをUTCに設定しましたが、私はこれを試しましたが、サーバ時間だけを取って、ユーザ時間ではありません。 – RaMeSh

関連する問題