如何仅比较 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 中的日期部分的主要内容,如果未能解决你的问题,请参考以下文章
Cosmos db 使用 Java SDK 部分更新 SQL api
如何在 C# 应用程序范围内更改仅日期部分将用于日期时间比较