我正在使用docdb。我想仅使用日期查询processTime而不是datetime。我的输入pdate = 26-09-2017,这是dateonly。我正在使用强制转换函数将日期时间转换为sql查询中的日期,但我收到语法错误。我在 c#中这样做。使用 LINQ 进行查询
我在文档db中有以下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"}
答案 0 :(得分: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')
答案 1 :(得分:1)
@nacho的答案看起来会起作用。但是,ISO-8601格式的优点在于您还可以进行字符串比较。所以SQL查询变为:
SELECT * FROM cols e WHERE e.submittedBy = @ci AND STARTSWITH( e.processTime, @dateString)
@dateString应该是格式为“2017-10-20”的字符串。
注意,您也可以通过这种方式进行日期范围,只要在submittedBy字段上有一个范围索引,方法是使用不等式运算符>和< =。但请注意,范围中的第二个日期是独占的,而第一个日期是包含的。
我还注意到你使用带有时移格式的ISO-8601字符串。只要您可以确定任何单个查询的数据始终具有相同的移位,那就没问题。但是,如果您想要对它进行更多控制,请将其存储在祖鲁时间(GMT)中,并通过在查询时调整字符串文字来在查询时进行移位。我已经在gist here中编写了这种方法,并且该文章中提到的tzTime和Lumenize库是为了促进这种方法而构建的。