如何仅比较 cosmos db 中的日期部分

Posted

技术标签:

【中文标题】如何仅比较 cosmos db 中的日期部分【英文标题】:how to compare only date part in cosmos db 【发布时间】:2022-01-22 06:35:51 【问题描述】:

我们正在 cosmosdb 中存储 (EmployeeId,Name,LogDate) 数据。 LogDate 数据是 Datetime,我们想从 Cosmos 中获取数据,其中 LogDate 在 '2018-01-15' 和 '2018-01-30' 之间,意味着只比较日期部分。

【问题讨论】:

2 月没有 30 天,所以这是一个奇怪的问题,但 WHERE LogDate >= '2018-01-15 00:00:00' AND LogDate < '2018-03-01 00:00:00'(后者是结束日之后实际存在的日期)将是在常规 SQL 中执行此操作的一种方法. CosmosDB 应该能够做类似的事情。 【参考方案1】:

我来自 CosmosDB 工程团队。虽然 Jay 的答案是另一种选择,但您仍然可以将 DateTimes 保留为默认 ISO 8601 格式的字符串,并在 LogDate 上创建一个范围索引。您应该能够像这样使用 Cosmos DB SQL 查询对 DateTime 进行定期比较:

SELECT * FROM root where root.LogDate BETWEEN '2018-01-15' and '2018-01-30'

【讨论】:

我可以请你看看这个吗? ***.com/questions/61110774/… 我相信 Mark Brown 已经提供了合适的答案。 感谢 Krishnan 观看!【参考方案2】:

基于official document中的陈述:

或者,您可以将 DateTimes 存储为 Unix 时间戳,即 表示自 1 月 1 日以来经过的秒数的数字, 1970. Azure Cosmos DB 的内部时间戳 (_ts) 属性遵循这种方法。您可以使用 UnixDateTimeConverter 类来序列化 日期时间为数字。

所以,我建议您将 DateTimes 序列化为数字以与条件进行比较。

你可以在 sql 中使用User Defined Function:

UDF:

    function convertTime(datetime)
        datetime = datetime.replace(/-/g,'/')  
        if(datetime)
            var date = new Date(datetime);
        else
            var date = new Date();
        
        time1 = date.getTime(); 
        return time1;
    

SQL:

SELECT c.LogDate FROM c
where udf.convertTime(c.LogDate) > udf.convertTime('2018-01-15') 
and udf.convertTime(c.LogDate) < udf.convertTime('2018-02-20')

输出:

当然,您可以在代码中转换日期时间,而不是使用 UDF。

【讨论】:

必须改变数据存储机制。这不是问题的真实答案。

以上是关于如何仅比较 cosmos db 中的日期部分的主要内容,如果未能解决你的问题,请参考以下文章

仅比较日期部分而不比较 JavaScript 中的时间

Cosmos db 使用 Java SDK 部分更新 SQL api

如何在 C# 应用程序范围内更改仅日期部分将用于日期时间比较

Cosmos DB 补丁子对象

Azure C#,过滤存储在cosmos DB中的原始数据(通过功能URL显示)

如何从 Databrick/PySpark 覆盖/更新 Azure Cosmos DB 中的集合