本人微信公众号:微软动态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