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
上的范围索引。
我在我的 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
上的范围索引。