You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DevExpress XtraReport日期时间范围参数计算及数据源填充报错

问题:DevExpress XtraReport日期时间范围参数查询报错

在DevExpress XtraReport中设置日期(开始-结束)和时间(开始-结束)范围参数后,填充数据源时抛出异常:执行SQL查询时失败,错误原因为time与datetime数据类型在大于等于运算符中不兼容。

涉及的查询参数@DateRang_Start、@DateRang_End、@TimeRang_Start、@TimeRang_End均为DateTime类型,对应值均为09/10/2024 12:00:00。

相关代码如下:

SqlConn.ConnectionString = "Server=ACCOUNTANT;database=xxxxxxx;User ID=xx;Password=xxxxxxxxx"
If SqlConn.State = ConnectionState.Open Then
    SqlConn.Close()
End If

SqlConn.Open()
'=================

Dim report As New XtraReport1

'Filter By Date ( Start - End ):
report.Parameters("DateRang_Start").Value = dtDateStart.EditValue
report.Parameters("DateRang_End").Value = dtDateEnd.EditValue


'Filter By Time ( Start - End ) :
report.Parameters("TimeRang_Start").Value = dtTimeStart.EditValue
report.Parameters("TimeRang_End").Value = dtTimeEnd.EditValue

'--------------------------------
DocumentViewer1.DocumentSource = report
report.CreateDocument()
report.RequestParameters = False
'----------------
SqlConn.Close()
解决思路

1. 修正SQL查询的类型兼容问题

报错核心是time类型字段与datetime类型参数直接比较导致的类型不兼容。针对SQL Server数据库,可通过类型转换解决:

  • 如果数据库表中是time类型字段,将datetime参数转为time类型后再比较:
    表中Time字段 >= CAST(@TimeRang_Start AS TIME)
    
  • 如果需要结合日期和时间筛选,可将日期参数与时间字段拼接为完整datetime:
    CAST(@DateRang_Start AS DATE) + CAST(表中Time字段 AS DATETIME) >= @DateRang_Start + CAST(@TimeRang_Start AS TIME)
    

2. 调整报表参数类型

若时间参数仅需提取时间部分,将@TimeRang_Start、@TimeRang_End的参数类型改为TimeSpan,赋值时直接取时间控件的时间部分:

report.Parameters("TimeRang_Start").Value = dtTimeStart.Time
report.Parameters("TimeRang_End").Value = dtTimeEnd.Time

此时SQL查询中可直接用TimeSpan参数与time字段比较,无需额外转换。

3. 合并日期与时间参数(推荐)

将日期和时间控件的值合并为完整的DateTime参数,避免分开处理的类型问题:

  1. 在报表中创建两个DateTime参数@StartDateTime和@EndDateTime
  2. 赋值时合并日期和时间:
    Dim startDate As Date = dtDateStart.EditValue
    Dim startTime As TimeSpan = dtTimeStart.Time
    report.Parameters("StartDateTime").Value = startDate.Add(startTime)
    
    Dim endDate As Date = dtDateEnd.EditValue
    Dim endTime As TimeSpan = dtTimeEnd.Time
    report.Parameters("EndDateTime").Value = endDate.Add(endTime)
    
  3. SQL查询中直接用合并后的参数与表中datetime类型字段比较:
    表中DateTime字段 BETWEEN @StartDateTime AND @EndDateTime
    

内容的提问来源于stack exchange,提问作者Bassam Alqadhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:32:42