Skip to main content What is Dynamics 365? Guided tours Customer stories Try our products CRM ERP Sales Service Sales Customer Insights Customer Service Contact Center Field Service Supply Chain Management Commerce Finance Project Operations Human Resources Business Central Pricing Business application topics Training & certifications Migrate to the cloud Documentation Events Dynamics 365 Blog Product updates Onboarding and implementation Community Find a partner Software Development Companies Partner resources Microsoft Marketplace Product documentation Technical support On-premises product support Contact us Try for free Sign in
  • 1 min read

Passing UtcDateTime values in extended query syntax


Recently I was looking into the issue of passing UtcDateTime values into a query in X++ using extended query syntax.

First I will just clarify what I mean when saying “extended query syntax”:

This is extended query syntax:

('(validUntilDate = %1)', DateTimeUtil::toStr(utcRefDateTime));

This is the regular syntax for ranges:

('%1', queryValue(utcRefDateTime));

As you can see in my examples above, for the regular syntax using queryValue() is fine, but when using the extended query syntax, there are 3 basic rules for utcDateTime values:

  • it’s necessary to use DateTimeUtil::toStr() to pass utcDateTime values.
  • The query string needs to have brackets around it.
  • No speechmarks/quotations should be used around the utcDateTime value.

So working example:

queryStr = strfmt(@"((StartDate < %2) && (EndDate < %2) && (validUntilDate = %1))", DateTimeUtil::toStr(2010-01-10T14:00:00), DateTimeUtil::toStr(2010-01-10T17:00:00));

And a failing example with brackets missing:

queryStr = strfmt(@"((StartDate < %2) && EndDate < %2 && (validUntilDate = %1))", DateTimeUtil::toStr(2010-01-10T14:00:00), DateTimeUtil::toStr(2010-01-10T17:00:00));

Failing with speechmarks/quotations:

queryStr = strfmt(@"((StartDate < %2) && (EndDate < '%2') && (validUntilDate = %1))", DateTimeUtil::toStr(2010-01-10T14:00:00), DateTimeUtil::toStr(2010-01-10T17:00:00));

There is an exception to these rules, that is when using 1900-01-01T00:00:00. Most functions in X++ are returning this as NULL when converting to a string but for the extended range syntax to work correctly we need it to be returned as a string, so the following functions cannot be used:

QueryValue()
dateTime2Str()
DateTimeUtil::toStr()
Global::utcDateTimeNull()
DateTimeUtil::minValue()

So in my environment I have introduced a new global function to make it easier for me to convert utcDateTime values to strings for extended query ranges, called dateTime2strQuery()

static str dateTime2strQuery(utcDateTime _utcDateTime)
{
str cvtDateTime;
;

If(_utcDateTime==DateTimeUtil::minValue())
    cvtDateTime = '1900-01-01T00:00:00';
else
  cvtDateTime = DateTimeUtil::toStr(_utcDateTime);

return cvtDateTime;
}

So now my working example looks like this:

queryStr = strfmt(@"((StartDate < %2) && (EndDate < %2) && (validUntilDate = %1))", dateTime2strQuery(2010-01-10T14:00:00), dateTime2strQuery(2010-01-10T17:00:00));

Get started with Dynamics 365

Drive more efficiency, reduce costs, and create a hyperconnected business that links people, data, and processes across your organization—enabling every team to quickly adapt and innovate.