2016-05-19 2 views
0

それぞれドキュメントを選択する必要があります。条件を使用して存在を確認する必要があります。 SQLでは、私は、クエリ、次の書く必要があります。タイムスタンプでデータを選択する方法...(タイムスタンプはサーバー側で読む必要があります)

SELECT * 
FROM dummy 
WHERE 
    timestamp >= CURRENT_TIMESTAMP - 300 

CURRENT_TIMESTAMP - 300は、「現在のサーバのタイムスタンプマイナス5分」にかかわらず、使用するSQLサーバー(構文は異なります)として読まれるべきです。

これを達成するには、サーバータイムスタンプを使用する必要があります。その理由は明らかです。クライアントの日時設定を信頼できません。

私はクライアントから現在のサーバーのタイムスタンプを読み取ってフィルターを作成することができますが、サーバーのタイムスタンプに直接アクセスできるフィルターを構成するのがより快適で重大です。

FilterDefinition<BsonDocument> filter = new BsonDocument() 
{ 
    { "$or", new BsonArray() 
    { 
     new BsonDocument() { { "processing_started", new BsonDocument() { { "$exists", false } } } }, 
     new BsonDocument() { { "processing_started", BsonNull.Value } }, 
     new BsonDocument() 
     { 
      { "$and", new BsonArray() 
      { 
       new BsonDocument() { { "processing_status", "started" } }, 
       new BsonDocument() { { "processing_started", new BsonDocument() { { "$lte", new BsonDocument() { { "$subtract", new BsonArray() { "new Date()", ProcessingTimeout * 1000 } } } } } } } 
      } 
      } 
     } 
    } 
    } 
}; 

をそれ"new Date()"式は、サーバー側またはクライアント上で評価されている場合、私はわからない:

私は現在、このフィルタを使用しています。

答えて

-1

あなたが離陸している300は、日であり、1 = 1日です。サーバの時刻についてコメントするのに

はい - これを行う最も簡単な方法は、ちょうど24そして60

((5.0/24.0/60.0)CURRENT_TIMESTAMP)で分を分割すると考えられます。クライアントのマシン上で実行されているアプリケーションの場合はクライアントの時刻になりますが、コードがSQLの場合はサーバーの時刻になります。

+0

フィルタはクライアントアプリケーション内で実行されるため、クライアントの時間が得られます。サーバ時間に直接アクセスするフィルタを構築する方法はありますか? –

+0

SQLはサーバ時間になります。私のコメントに述べられている通り。 SQLを使用してチェックしているのはサーバー時間なので、SQLを使用して正しい方法で処理しています。このために何らかのサービスを書くのではなく、クライアントのアプリケーションをチェックする方法はありませんが、SQLを使用するとサーバーの時間を稼ぐことができます。 –

+0

あなたのアプリケーションにサーバー時間を取得する必要がある場合は、単にSQL CALLRENT_TIMESTAMPを呼び出すことができます –

関連する問題