2014-03-27 160 views
1

因此,我有一系列在NoSQL數據庫(Couchbase)中存儲爲純Json的文檔。這些文檔包含一個包含DateTime值的「Created」字段。我通過Elasticsearch執行以下查詢,它返回的結果是我不希望它返回。Elasticsearch按日期查詢返回不正確的結果

查詢:

"query": 
{ 
"bool": 
{ 
    "must": [ 
    { 
     "range": 
     { 
      "couchbaseDocument.doc.Created": 
      { 
       "from":"2014-03-27T00:00:00.0000000", 
       "to": "2014-03-27T23:59:00.0000000" 
      } 
     } 
    }, 
    { 
     "term": 
     { 
      "couchbaseDocument.meta.expiration": "0" 
     } 
    }], 
    "must_not": [ ], 
    "should": [ ] 
}, 
from: 0, 
size:25000 
} 

我希望這個查詢只能在3/27與創建日期返回結果一段時間。不過,我從3/26獲得了一些結果。例如,它返回一個具有以下創建字段的文檔:

"Created": "2014-03-26T21:40:26.2856631-04:00" 

爲什麼在結果集中返回此文檔?

回答

2

您的查詢是在GMT時區(aka UTC;又名祖魯時間)搜索日期/時間,也就是說在它們末尾有一個隱含的+00:00

"from" : "2014-03-27T00:00:00.0000000+00:00", 
"to" : "2014-03-27T23:59:00.0000000+00:00" 

GMT是用於存儲日期/時間相當標準時區,但現在看來,你必須存儲在不同的時區文件(他們似乎是通過後期EDT或AST,這是Atlantic Time Zone) ,這是-04:00或比格林威治標準時間晚4個小時。因此,當它是midnight on March 27, 2014 in GMT時,它仍然是8 PM on March 26, 2014 in AST(8點是當天的第20個小時)。

從本質上講,當你看到-04:00,那麼你需要添加04:00的時間,這爲4小時0分鐘。一旦這樣做,那麼你可以刪除這個時區標記,因爲:

2014-03-26T21:40:26.2856631-04:00 

相同

2014-03-27T01:40:26.2856631+00:00 

這是一樣的

2014-03-27T01:40:26.2856631 

因爲21 + 04 = 25,和一小時25天是01下一個天(25 - 24 = 01,因此給予1天一個nd 1小時;值得注意的是,24 - 24 = 00,這就是爲什麼00代表午夜)。

爲了讓這一切都回到問題:返回時間應該在您的結果,因爲就格林威治時間而言,它是在您的搜索範圍內。

僅供參考,EST爲-05:00,PST爲-08:00

+0

是的,看起來像我在當地時間而不是UTC存儲我的文檔。謝謝! –

相關問題