查询日期而不是datetime docdb

时间:2017-09-27 07:34:48

标签: c# mysql linq azure-cosmosdb

我正在使用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"}

2 个答案:

答案 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库是为了促进这种方法而构建的。