首页 > 解决方案 > Cosmos DB DateTimePart 不解析某些日期

问题描述

Cosmos DB 似乎无法解析带有 6 位小数秒的日期,例如2020-08-25T10:00:14.634466Z.

此外,我发现了一个有趣的模式:

SELECT TOP 1 
    DateTimePart("yyyy", "2020-08-25T12:01:01Z"),
    DateTimePart("yyyy", "2020-08-25T12:01:01.1Z"),
    DateTimePart("yyyy", "2020-08-25T12:01:01.11Z"),
    DateTimePart("yyyy", "2020-08-25T12:01:01.111Z"),
    DateTimePart("yyyy", "2020-08-25T12:01:01.1111Z"),
    DateTimePart("yyyy", "2020-08-25T12:01:01.11111Z"),
    DateTimePart("yyyy", "2020-08-25T12:01:01.111111Z"),
    DateTimePart("yyyy", "2020-08-25T12:01:01.1111111Z")
FROM c

结果:

[
    {
        "$1": 2020,
        "$4": 2020,
        "$8": 2020
    }
]

甚至可以正确解析年份的唯一组合具有 0、3 和 7 位小数秒。

Cosmos DB DateTimePart的文档似乎确实假设了 7 位小数秒,但我也没想到它在四舍五入时无法解析。

没有先截断字符串以消除小数秒,有没有更好的方法来解决这个问题?此外,有没有办法确保 Cosmos SDK for .NET 正确序列化 DateTimes 的 7 位小数秒,而不是在最后一位为 0 时截断为 6 位?就我而言,我只是存储 的结果DateTime.UtcNow,并且一些值以 6 位小数秒结尾。

标签: azure-cosmosdbazure-cosmosdb-sqlapi

解决方案


如果我正确理解你的问题,你可以试试这个:

SELECT TOP 1 
    left( "2020-08-25T12:01:01Z",4),
    left( "2020-08-25T12:01:01.1Z",4),
    left( "2020-08-25T12:01:01.11Z",4),
    left( "2020-08-25T12:01:01.111Z",4),
    left( "2020-08-25T12:01:01.1111Z",4),
    left( "2020-08-25T12:01:01.11111Z",4),
    left( "2020-08-25T12:01:01.111111Z",4),
    left( "2020-08-25T12:01:01.1111111Z",4)

如果要确保 7 位数字,可以将属性类型更改为字符串并使用以下代码:

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss:fffffffZ")

推荐阅读