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')