#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
функция. С этого момента я буду использовать это.