【问题标题】:how to compare only date part in cosmos db如何仅比较 cosmos db 中的日期部分
【发布时间】:2019-06-09 02:59:27
【问题描述】:

我们正在 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 应该能够做类似的事情。

标签: azure-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'

【讨论】:

【解决方案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。

【讨论】:

  • 必须改变数据存储机制。这不是问题的真正答案。
猜你喜欢
  • 2011-02-11
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多