CosmosDB 中日期时间字段的 SQL 查询问题

Issue with a SQL query on a date time field in CosmosDB

我必须进行查询以选择属于两个日期(开始和结束)之间的间隔的集合元素。虽然开始日期约束得到遵守,但结束日期似乎总是晚了两个小时。提取的项目大于或等于开始日期且小于或等于结束日期减去两个小时。

项目示例如下:

{
  "messageUID": "xxxxxxxxx22019-05-31T16:59:16+02:00",
  "deviceId": "xxxxxxxxxxxxx",
  "dateTimeDevice": "2019-05-31T14:59:16",
  "messageId": 39,
  "release": 104,
  "VIn": 23430,
  "VOut": 20592,
  "AIn": 53,
  "AOut": 40,
  "CosPhi": 43,
  "W": 54,
  "Var": 112,
  "VA": 125,
  "WhCnt": 365009,
  "VarhCnt": 756729,
  "TimeSlot": 0,
  "MeterTS": "2019-05-31 16:59:17",
  "Sampling": 60,
  "Wh": 3422,
  "Varh": 7098,
  "WSaved": 0,
  "EventProcessedUtcTime": "2019-05-31T14:59:18.3140933Z",
  "PartitionId": 1,
  "EventEnqueuedUtcTime": "2019-05-31T14:59:18.29Z",
  "IoTHub": {
    "MessageId": null,
    "CorrelationId": null,
    "ConnectionDeviceId": "Device",
    "ConnectionDeviceGenerationId": "636909297614425839",
    "EnqueuedTime": "2019-05-31T14:59:18.296Z",
    "StreamId": null
  },
  "id": "EBBBrain-1060894172",
  "_rid": "dEkOAONukRECAAAAAAAAAA==",
  "_self": 
  "dbs/dEkOAA==/colls/dEkOAONukRE=/docs/dEkOAONukRECAAAAAAAAAA==/",
  "_etag": "\"2400a2a2-0000-0c00-0000-5cf1415c0000\"",
  "_attachments": "attachments/",
  "_ts": 1559314780
}

查询的where子句如下:

sqlQuerySpec.QueryText += "where (c.EventProcessedUtcTime >= @startdate) and ";
sqlQuerySpec.QueryText += "(c.EventProcessedUtcTime <= @enddate) and ";
sqlQuerySpec.QueryText += "(c.deviceId = @deviceId)";
sqlQuerySpec.Parameters = new SqlParameterCollection()
  {
    new SqlParameter("@startdate",startdate.ToString("yyyy-MM-ddTHH:mm:ss.FFFFFFFZ")),
    new SqlParameter("@enddate",enddate.ToString("yyyy-MM-ddTHH:mm:ss.FFFFFFFZ")), 
    new SqlParameter("@deviceId", deviceId)
  };

在调试中似乎参数传递正确。

解决了更改代码的问题如下:

sqlQuerySpec.QueryText += "where (RIGHT(c.messageUID, 25) >= @startdate) and ";
sqlQuerySpec.QueryText += "(RIGHT(c.messageUID, 25) <= @enddate) and ";
sqlQuerySpec.QueryText += "(c.deviceId = @deviceId)";
sqlQuerySpec.Parameters = new SqlParameterCollection()
  {
    new SqlParameter("@startdate",DateTime.SpecifyKind(startdate,DateTimeKind.Unspecified)),
    new SqlParameter("@enddate",DateTime.SpecifyKind(enddate,DateTimeKind.Unspecified)), 
    new SqlParameter("@deviceId", deviceId)
  };

在此先感谢大家。

我用以下代码解决了我的问题:

sqlQuerySpec.QueryText += "where (RIGHT(c.messageUID, 25) >= @startdate) and ";
sqlQuerySpec.QueryText += "(RIGHT(c.messageUID, 25) <= @enddate) and ";
sqlQuerySpec.QueryText += "(c.deviceId = @deviceId)";
sqlQuerySpec.Parameters = new SqlParameterCollection()
  {
    new SqlParameter("@startdate",DateTime.SpecifyKind(startdate,DateTimeKind.Unspecified)),
    new SqlParameter("@enddate",DateTime.SpecifyKind(enddate,DateTimeKind.Unspecified)), 
    new SqlParameter("@deviceId", deviceId)
 ;

感谢大家。