Azure CosmosDB 不在 Where 子句中使用 UDF 返回结果

Azure CosmosDB not returning results with UDF in Where clause

我在我的 Azure CosmosDB 中创建了一个 UDF,以便我可以查询 Timestamp 字段等于特定年份的记录。

例如,我的查询如下所示:

SELECT * FROM c WHERE c.StaticKey = 'd6c5a92203d84ce28b94cfc64a6ad4ce' 
AND udf.YEAR(c.Timestamp) = '2020' OFFSET 0 LIMIT 1

但出于某种原因,我的查询总是 returns 0 个结果。我的 table 中有很多记录的日期时间是今年的。

这个例子的记录 return 1 行并打印 2020:

SELECT udf.YEAR(c.Timestamp) FROM c WHERE c.StaticKey = 'd6c5a92203d84ce28b94cfc64a6ad4ce' OFFSET 0 LIMIT 1

我在 Azure 中的 UDF 如下所示:

function YEAR(datetimeString){
    var datetime = new Date(Date.parse(datetimeString));
    return datetime.getFullYear();
}

Timestamp 包含如下所示的日期时间值:2020-10-20T07:13:22.802346

正如您在此 fiddle 中所见,javascript 函数运行良好:https://jsfiddle.net/0eozyhnv/

有人知道为什么我的 UDF 在我的 WHERE 子句中不起作用吗?

您的 UDF returns 一个整数。所以你应该这样写查询:

SELECT * FROM c WHERE c.StaticKey = 'd6c5a92203d84ce28b94cfc64a6ad4ce' 
AND udf.YEAR(c.Timestamp) = 2020 OFFSET 0 LIMIT 1

但请注意,这相对较慢,因为 UDF 无法使用索引。如果您可以使用 Cosmos DB (YYYY-MM-DDThh:mm:ss.fffffffZ) 接受的格式设置日期格式,您还可以使用内置函数 DATETIMEPART('yyyy', c.Timestamp)=2020.

但是,我怀疑最快的解决方案是 STARTSWITH(c.Timestamp, '2020'),因为它使用了 Timestamp 上的范围索引。