Azure CosmosDB не возвращает результаты с UDF в предложении Where

#azure #azure-cosmosdb

#azure #azure-cosmosdb

Вопрос:

Я создал UDF в своей Azure CosmosDB, чтобы я мог запрашивать записи, где Timestamp поле равно определенному году.

Например, мой запрос выглядит так:

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

Но по какой-то причине мой запрос всегда возвращает 0 результатов. В моей таблице много записей с датами этого года.

Эта запись для exmaple возвращает 1 строку и выводит 2020 :

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

Мой UDF в Azure выглядит следующим образом:

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

Столбец Timestamp содержит значения даты и времени, которые выглядят следующим образом: 2020-10-20T07:13:22.802346 .

Как вы можете видеть в этой скрипке, функция javascript работает хорошо: https://jsfiddle.net/0eozyhnv /

У кого-нибудь есть идеи, почему мой UDF не работает в моем WHERE предложении?

Ответ №1:

Ваш UDF возвращает целое число. Итак, вы должны написать запрос следующим образом:

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

Но обратите внимание, что это относительно медленно, поскольку UDFS не может использовать индексы. Если вы можете отформатировать свои даты в формате, принятом Cosmos DB ( YYYY-MM-DDThh:mm:ss.fffffffZ ), вы также можете использовать встроенную функцию DATETIMEPART('yyyy', c.Timestamp)=2020 .

Однако я подозреваю, что самым быстрым решением будет STARTSWITH(c.Timestamp, '2020') , поскольку при этом используется индекс диапазона on Timestamp .

Комментарии:

1. Также спасибо за предложения! Я понятия не имел, что существует DATETIMEPART функция. С этого момента я буду использовать это.