如何在Cosmos Db中查询文档以进行日期比较时截断时间

时间:2018-07-24 09:51:58

标签: azure azure-cosmosdb azure-cosmosdb-sqlapi

我的文档包含这样的属性

{
    "id":"1bd13f8f-b56a-48cb-9b49-7fc4d88beeac",
    "name":"Sam",
    "createdOnDateTime": "2018-07-23T12:47:42.6407069Z"    
}

我想基于存储为字符串的createdOnDateTime查询文档。

查询,例如-

SELECT * FROM c where c.createdOnDateTime>='2018-07-23' AND c.createdOnDateTime<='2018-07-23'

这将返回当天创建的所有文档。

我正在从日期选择器中提供日期值,该日期选择器只提供没有时间的日期,因此在比较日期时给我带来了问题。

是否有任何方法可以节省createdOnDateTime属性中的时间,或者还有其他方法可以实现此目的?

2 个答案:

答案 0 :(得分:1)

CosmosDB客户端将时间戳存储在ISO8601 format中,这样做的一个很好的理由是它的lexicographical order与时间流匹配。含义-您可以对这些字符串进行排序和比较,并按照它们表示的时间对其进行排序。

因此,在这种情况下,您无需删除时间分量,只需修改传入的参数即可获得所需的结果。如果您希望从SELECT * FROM c WHERE c.createdOnDateTime >= '2018-07-23' AND c.createdOnDateTime < '2018-07-24' 的整个日期开始输入所有条目,则可以使用查询:

createdOnDateTime

请注意,此查询可以在{{1}}上使用RANGE索引。

答案 1 :(得分:0)

Please use User Defined Function to implement your requirement, no need to update createdOnDateTime property.

UDF:

function con(date){
    var myDate = new Date(date);

    var month = myDate.getMonth()+1;
    if(month<10){
        month = "0"+month; 
    }
    return myDate.getFullYear()+"-"+month+"-"+myDate.getDate();
}

SQL:

SELECT c.id,c.createdOnDateTime FROM c where udf.con(c.createdOnDateTime)>='2018-07-23' AND udf.con(c.createdOnDateTime)<='2018-07-23'

Output :

enter image description here

Hope it helps you.