首页 > 解决方案 > 我可以对 Azure Cosmos 中的 DateTimeOffset 序列化对象使用 DateTimePart 函数吗?

问题描述

我正在尝试使用 DateTimePart 函数对我的 Cosmos 数据库执行查询:

SELECT c.callTime,c.id,c.source,DateTimePart('m', c.callTime) as month FROM c where c.ownerId='3467nm6df'

但是在该查询的结果中,我在“月份”字段中什么也没有:

{
    "callTime": "2020-09-30T20:17:28+00:00",
    "id": "352hyKL5agNtB4ic",
    "source": "five9"
}

我的 cosmos 数据库中的文档结构如下:

public class CallIndex
{
    public string id;
    public DateTimeOffset callTime;
    public string source;
}

一些示例数据如下所示:

{
    "callTime": "2020-09-30T20:17:32+00:00",
    "id": "352WMvL5agNwiU7u",
    "source": "five9"
},
{
    "callTime": "2020-09-30T20:17:28+00:00",
    "id": "352hyKL5agNtB4ic",
    "source": "five9"
},
{
    "callTime": "2020-09-30T20:16:51+00:00",
    "id": "352iS3L5agN4yAog",
    "source": "five9"
}

在进行一些研究时,我发现有关DateTimeOffsetAzure Csosmos 中的类型支持的相互矛盾的信息。在一些文章中,指出 Cosmos 支持DateTimeOffset. 在其他文章中,指出 Cosmos 不支持DateTimeOffset,我应该DateTime改用。

我们已经DateTimeOffset在代码中使用了很多东西。在我们尝试上述查询之前,它实际上运行良好。我们以 UTC 存储所有内容,并且我们使用DateTimeOffsetin 代码能够轻松地转换为报告中的客户端时区。所以我的问题是,2020-09-30T20:16:51+00:00函数是否支持格式(带偏移量的 ISO 日期时间)DateTimePart?或者DateTimePart仅适用于这样的格式:2020-09-30T20:16:51.000000Z(ISO DateTime 格式)?

如果后者为真,那么我们需要将所有现有数据转换为 ISO 8061 DateTime 格式,而不是带偏移量的 ISO 8061 DateTime 格式。如果我们最终这样做,我如何告诉 Newtonsoft 如何将 DateTimeOffset 对象呈现为 ISO 8061 DateTime(无偏移)?

标签: c#jsondatetimeazure-cosmosdbdatetimeoffset

解决方案


是的。Azure Cosmos DB 中日期时间字符串的推荐格式是 yyyy-MM-ddTHH:mm:ss.fffffffZ,它遵循ISO 8601 UTC标准。您上面显示的格式不适用于查询中的 DateTime 系统函数。


推荐阅读