2017-02-09 12 views
3

Я создаю новое приложение Logic, которое читает таблицу, где DateCreated < ADDDAYS(-60,GETDATE()), и обновляет бит Archived до 1.Azure Logic App SQL ODATA Filter on Date

Однако я не могу на всю жизнь понять, как реализовать этот фильтр как часть запроса ODATA.

Вот что я пытаюсь до сих пор: DateCreated lt addDays(utcNow(),-60)

Однако я получаю "An unknown function with name 'utcnow' was found. This may also be a function import or a key lookup on a navigation property, which is not allowed.\r\n inner exception: An unknown function with name 'utcnow' was found. This may also be a function import or a key lookup on a navigation property, which is not allowed."

Как можно фильтровать по динамической дате в файлере?

ответ

2

Однако я не могу на всю жизнь выяснить, как реализовать этот фильтр как часть запроса ODATA.

Я полагаю, вы имеете в виду запрос ODATA на SQL-коннектор?

Вы можете попробовать следующее:

DateCreated л @ {addDays (utcNow(), - 60)}

+0

Привет Steven, спасибо за подсказку. Я сделал это, и теперь я получаю Тело { "status": 400, "message": "Неверное выражение Mashup с использованием заданных значений. \ R \ n внутреннее исключение: мы не можем применять оператор <к типам DateTimeZone и DateTime. ", " source ":" 127.0.0.1 " } –

+0

Вы можете попробовать DateCreated le @ {addDays (utcNow(), - 60)} –

+0

Да, такая же ошибка :(Для чего это стоит, DateCreated is nullable DateTime в db –

0

Исходя из предыдущего ответа, вы должны попробовать ту же команду:

DateCreated lt @{addDays(utcNow(),-60)} 

Но также вы должны убедиться, что ваш тип данных на стороне SQL должен быть datetimeoffset.

Три решения, чтобы сделать это:

  • Изменить тип вашего поля в таблице,

  • Создать вид и брось поле DateCreated к DateTimeOffset CREATE VIEW [DBO] [. MyView] AS SELECT, мышимоиПоля, ..., CAST (DateCreated AS DateTimeOffset) AS DateCreated ОТ MyTable

  • Создать процедуру магазина с Параметр DateTimeOffset и преобразовать параметр в DATETIME

Если вы не можете изменить код SQL, этот кусок кода является решение:

year(DateCreated) lt year(@{addDays(utcNow(),-60)}) or (
    year(DateCreated) eq year(@{addDays(utcNow(),-60)}) and (
      month(DateCreated) lt month(@{addDays(utcNow(),-60)} or (
       month(DateCreated) eq month(@{addDays(utcNow(),-60)} 
       ... <same thing for other date parts> 
     ) 
    ) 
) 

Вы должны сравнить каждую часть вашего дня :

Это интересная проблема, которая иногда возникает, когда датируются даты, раз, даты и конкретный часовой пояс. Сравнение DateTimeZone с датой проблематично, потому что оно может быть меньше в арифметических терминах, но только в том случае, если часовой пояс соответствует ... без этого критической информации, эти типы данных не могут сравниться.

Одним из вариантов является использование стандартных функций OData для извлечения частей типа данных.Например:

$ фильтр = год (RELEASE_DATE) л год (ДТЗ)

Конечно, вы должны быть carful, чтобы убедиться, что вы реализуете правильную логику относительно timezone-, но вы, наверное, знаете это.

OData Ссылка: http://www.odata.org/documentation/odata-version-2-0/uri-conventions/

+0

SQL не в моем распоряжении. Если бы я мог использовать для datetimeoffset в приложении Logic, это сработало бы для меня, но я не могу изменить сторону SQL –

+0

У меня такая же проблема. –

+0

Просто попросил Microsoft. –