OData日期过滤语法错误:DateTime查询解析失败求助
OData查询中DateTime语法错误修正方案
问题描述
尝试将DateTime值传入OData查询的$filter参数时持续报错,错误信息如下:
{"code":"BadRequest","message":"Syntax error at position 13 in 'Date ge 17-01-2024 00:00:00'."}
使用的代码示例:
DateTime date1 = new DateTime(2024,01,17); // 获取行数据 var data = context.Kapbehov.AddQueryOption("$filter", "Date ge "+date1);
已尝试过的调整:在日期前添加datetime关键字、更换日期格式等,但问题未解决。
目标数据表来自Business Central Web服务的OData端点,相关字段结构:
"Starting_Time": "07:00:00", "Starting_Date_Time": "2024-01-23T07:00:00Z", "Ending_Time": "08:35:00", "Ending_Date_Time": "2024-01-23T08:35:00Z", "Date": "2024-01-23",
修正方案
根据Business Central的OData语法规范,针对不同类型的日期字段,需要使用对应的格式:
1. 针对仅日期的Date字段(字符串格式YYYY-MM-DD)
有两种可行写法:
写法一:使用datetime关键字包裹日期值
DateTime date1 = new DateTime(2024, 01, 17); // 格式化日期为YYYY-MM-DD并构造过滤语句 var filter = $"Date ge datetime'{date1:yyyy-MM-dd}'"; var data = context.Kapbehov.AddQueryOption("$filter", filter);
写法二:直接匹配字符串格式的日期
因为目标Date字段存储的是字符串类型的日期,也可以直接用字符串匹配:
DateTime date1 = new DateTime(2024, 01, 17); var filter = $"Date ge '{date1:yyyy-MM-dd}'"; var data = context.Kapbehov.AddQueryOption("$filter", filter);
2. 针对带时间的字段(如Starting_Date_Time)
如果需要过滤带时间戳的字段,需使用datetime'YYYY-MM-DDTHH:mm:ssZ'格式:
DateTime dateTime1 = new DateTime(2024, 01, 23, 7, 0, 0, DateTimeKind.Utc); var filter = $"Starting_Date_Time ge datetime'{dateTime1:yyyy-MM-ddTHH:mm:ssZ}'"; var data = context.Kapbehov.AddQueryOption("$filter", filter);
关键注意点
- 禁止直接拼接
DateTime对象,默认的日期格式(如17-01-2024 00:00:00)不符合OData语法要求 - 必须用单引号包裹日期值,配合
datetime关键字(针对日期时间类型字段)或直接匹配字符串(针对字符串类型日期字段)
内容的提问来源于stack exchange,提问作者user16483107
相关产品推荐
相关产品推荐

