2017-09-27 55 views
0

我正在使用docdb。我想查詢與日期 processTime而不是日期時間。我的輸入pdate = 26-09-2017這是日期。我正在使用強制轉換日期時間到SQL查詢日期時間,但我得到語法錯誤。我在c#中這樣做。使用LINQ查詢查詢日期而不是日期時間docdb

我在文檔數據庫中有以下json。

[{ 
"processTime": "2017-09-26T21:05:28.7954106+05:30", 
"submittedBy": "671" 
} 
{ 
"processTime": "2017-09-26T21:05:28.7954106+05:30", 
"submittedBy": "679" 
} 
{ 
"processTime": "2017-09-26T21:05:28.7954106+05:30", 
"submittedBy": "679" 
} 
] 

我查詢數據庫如下

  new SqlQuerySpec() 
      { 
       QueryText = "SELECT * FROM cols e WHERE e.submittedBy = @ci AND CAST(e.processTime AS int) = @date", 
       Parameters = new SqlParameterCollection() 
       { 
       new SqlParameter("@ci", cid.ToString()), 
       new SqlParameter("@date", pdate) 
       } 
      }, DefaultOptions); 

我得到語法錯誤附近CAST功能

{"Message: {\"errors\":[{\"severity\":\"Error\",\"location\":{\"start\":61,\"end\":65},\"code\":\"SC1001\",\"message\":\"Syntax error, incorrect syntax near 'CAST'.\"}]}\r\nActivityId: 5661ff3b-64cb-46d7-8c9e-0125145a8fb3"} 

回答

1

@納喬的答案看起來像它會工作。然而,ISO-8601格式的美妙之處在於,您也可以只進行字符串比較。因此,SQL查詢變爲:

SELECT * FROM cols e WHERE e.submittedBy = @ci AND STARTSWITH(e.processTime, @dateString) 

@dateString應該是格式類似「2017-10-20」的字符串。

請注意,您也可以使用這種方式來執行日期範圍,只要使用不等式運算符>和< =,在已提交的字段中存在範圍索引即可。但請注意,範圍中的第二個日期是排他性的,而第一個日期是包含性的。

我還注意到你使用帶時間轉換格式的ISO-8601字符串。沒關係,只要您確定任何單個查詢的數據始終具有相同的轉換即可。但是,如果您想要對其進行更多控制,請將其存儲在祖魯語時間(GMT)中,並在查詢時通過在查詢時調整字符串文字來進行切換。我已經寫出了這個方法的要點here,並且在那篇文章中提到的tzTime和Lumenize庫是爲了促進這種方法而構建的。

1

嘗試使用DATE()函數來獲得唯一的一天processTime列如下:

 new SqlQuerySpec() 
     { 
      QueryText = "SELECT * FROM cols e WHERE e.submittedBy = @ci AND DATE(e.processTime) = STR_TO_DATE(@date,'%d-%m-%Y')", 
      Parameters = new SqlParameterCollection() 
      { 
      new SqlParameter("@ci", cid.ToString()), 
      new SqlParameter("@date", pdate) 
      } 
     }, DefaultOptions); 

您需要將PDATE值從DD-MM-AAAA轉換爲AAAA-MM-DD與

STR_TO_DATE(pdate,'%Y-%m-%d')