Dynamics CRM日期欄位查詢使用時分秒的方法
本人微信公眾號:微軟動態CRM專家羅勇 ,回覆293或者20190110可方便獲取本文,同時可以在第一間得到我釋出的最新博文資訊,follow me!我的網站是 www.luoyong.me 。
我們使用高階查詢對日期欄位進行篩選的時候,你會發現無法寫入時分秒,即使你下載下來,強行加上是時分秒,也是無效的,轉換成SQL的時候只保留日期部分。
<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> <entity name='incident'> <attribute name='title' /> <attribute name='incidentid' /> <filter type='and'> <condition attribute='createdon' operator='on' value='2019-01-03' /> </filter> </entity> </fetch>
上面的FetchXml執行的話(不論通過SOAP終結點還是Web API終結點),轉成T-SQL(假設呼叫使用者的時區是東八區),轉換後其實是createdon大於等於1月2日16:00:00,且小於1月3日16:00:00 。
那麼有沒有辦法精確到時分秒進行查詢呢?
答案是有,且聽我道來。
對於使用fetchxml來執行查詢,可以將日期欄位的篩選符號改成大於、大於或等於、小於、小於或等於,這樣就會有效,例如下面的fetchxml,注意日期要轉換成文字,使用 yyyy-MM-dd HH:mm:ss 格式。
<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> <entity name='incident'> <attribute name='title' /> <attribute name='incidentid' /> <filter type='and'> <condition attribute='createdon' operator='ge' value='2019-01-02 09:00:00' /> <condition attribute='createdon' operator='lt' value='2019-01-04 08:00:00' /> </filter> </entity> </fetch>
上面的FetchXml執行的話(不論通過SOAP終結點還是Web API終結點),轉成T-SQL(假設呼叫使用者的時區是東八區),轉換後其實是createdon大於等於1月2日01:00:00,且小於1月3日00:00:00 。
如果我用Web API終結點,使用ODATA語法來做,也可以使用大於、大於或等於、小於、小於或等於這樣的運算子號,類似如下的查詢:
https://demo.luoyong.me/api/data/v8.2/incidents?$select=incidentid&$filter=createdon ge 2019-01-02T09:00:00.000Z
上面的查詢執行,轉成T-SQL其實是createdon大於等於1月2日09:00:00 。
如果我使用QueryExpression呢?
經過測試也可以對日期時間型別欄位使用大於、大於或等於、小於、小於或等於的操作符,不論你傳入的時間是帶時區的時間還是UTC時間,生成的SQL都會將你傳入的時間轉換成UTC時間進行比較。
下面是總結時間:
1. 對日期時間型別欄位使用大於(gt)、大於或等於(ge)、小於(lt)、小於或等於(le)的操作符,這樣可以按照時分秒進行查詢
2.SOAP終結點,執行FetchmXml,會認為你傳入的時間(文字型別)是執行使用者偏好時區的時間,計算時會將你傳入的時間轉換成UTC 0時區時間進行計算,注意使用FetchXml的日期時間要使用 yyyy-MM-dd HH:mm:ss 這種格式。當然如果你使用QueryExpression時候傳入的就是時間,而不是文字,會轉換成UTC 0時區時間進行計算。
3.Web API終結點,如果是執行FetchXml,其行為和SOAP終結點一樣,會將你傳入的時間認為是執行使用者所偏好時區的時間,計算時會將你傳入的時間轉換成UTC 0時區時間進行計算。若是使用ODATA風格的話,則會認為你傳入的時間就是UTC 0時區的時間,不執行轉換。注意日期時間用這種風格:2019-01-02T09:00:00.000Z