c# - DateTime、Epoch 和 DocumentDb

标签 c# epoch azure-cosmosdb

所以我阅读了这个非常有趣的关于使用 datetime in Azure DocumentDb 的博客.问题在于,目前 Azure DocumentDb 不支持日期时间字段的范围搜索。原因是DocumentDb是基于json的,没有datetime类型,所以一般都是放在xml datetime格式的字符串中。

(显然 Mongo 没有这个问题,它的 bson 格式添加了 datetime 类型(以及其他))

无论如何,这篇文章描述了以纪元 (unix) 时间将日期时间存储在 json 中,本质上是将日期时间存储为自 01-01-1970 以来的秒数。 epoch 的一个问题是它不考虑闰秒,但我现在可以接受。

我的问题是我也想以这种格式存储出生日期。现在我可以将 01-01-1900 作为开始日期并将自该日期以来的天数存储在一个 int 中。虽然我很确定这会很好,但感觉纪元是一个成熟的概念,但生日的感觉就像我在建立自己的约定,这是我通常想避免的事情。

是否有将日期存储标准化为数字的既定标准?哪个日期应该是基准日期?

最佳答案

首先,更新:DocumentDB 现在支持字符串和数字的范围索引。您必须正确设置索引才能使其正常工作。

现在给大家推荐一下。我已经成功地将 ISO-8601 时间戳存储为字符串。这是 DocumentDB SDK 用于处理 DateTime 的默认格式,因此它比转换为整数更省力。

ISO-8601 日期/时间字符串有几个符合您需要的属性。

  1. 字母数字排序顺序是按时间顺序排列的,因此假设您具有适当精度的范围索引(-1 表示全精度),它可以完美地与使用 >、<、>=、<= 和 BETWEEN 的查询子句一起工作;
  2. 它们是人类可读的,因此如果您正在浏览表格,数据就有意义;
  3. 此格式允许指定更细粒度的日期/时间。例如,您应该说“2015-03”表示三月,或者说“2015-03-24”表示 2015 年 3 月 24 日。然后您可以使用此过滤器“startedOn >= 2015-03-”发出查询24 AND startedOn < 2015-03-25"以查找从 2015 年 3 月 24 日开始的所有内容。即使 startedOn 存储为完整的 ISO-8601 字符串(如“2015-03-24T12:34:56.789Z”),这仍然有效,因为字符串比较的性质。

我已经写过关于这种方法的文章 here .

关于c# - DateTime、Epoch 和 DocumentDb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31973710/

相关文章:

javascript - 在 Google 表格中将 Unix 纪元时间转换为日期

javascript - 在 JavaScript 中使用 moment.js 转换纪元时间

node.js - 使用 NodeJS 查询 CosmosDB

c# - DataGridView 单元格中的自定义控件

c# - 如何在大字符串中查找重复的短语

c# - 如何检查 List<T>.Sort 是否真的对某些东西进行了排序?

sql - 将数据工厂中的纪元时间转换为日期时间

azure-cosmosdb - "Request rate is large"在运行 mongorestore 到 CosmosDB 时

node.js - Azure函数中途重新启动然后永远不会返回(HTTP触发器)

c# - 从 .Net 中的 SAS 数据源读取数据