为什么我不能在ssrs中使用datetime参数?

时间:2015-05-20 08:42:16

标签: sql-server datetime reporting-services ssrs-2012

我有针对SQL Server日期时间字段的共享数据集查询生成的SSRS日期/时间参数。该参数在报表文本框中正确显示,但在嵌入式数据集查询中无效,即使是与生成日期时间值的表相同也是如此。

为了将参数用于数据集查询,我必须解析where子句的两边以使其在SSDT中的预览中起作用:

(convert(varchar,invoice.snapshot_datetime,120)) = (convert(varchar,@snapshotdatetime,120))

这非常低效。

如何在不解析invoice.snapshot_datetime列的情况下使我的where子句工作?

服务器详细信息

  • SQL Server语言为英语(美国)。
  • SQL Server dateformatmdy(来自dbcc useroptions)。
  • Getdate()在SSMS中返回'2015-05-20 10:27:56.687'

2 个答案:

答案 0 :(得分:1)

假设您的日期范围介于1900-01-01和2079-06-06之间,您可以转换为SmallDateTime以截断datetime变量的秒数:

DECLARE @DateTime datetime
SET @DateTime = CAST(CAST(@snapshotdatetime as SmallDateTime) as DateTime)

(感谢t-clausen.dkhis answer here

现在,由于您的实际列类型为DateTime,因此它会保留秒(和毫秒),您也需要将其删除。
但是,使用列上的函数将阻止SQL Server使用此列上可能包含的任何索引,因此更好的方法是使用DateTime范围:

DECLARE @FromDateTime datetime, @ToDateTime datetime
SET @FromDateTime = CAST(CAST(@snapshotdatetime as SmallDateTime) as DateTime)

如果超过29.998秒,演员将围绕小日期时间的分钟,如果低于29.999秒,则向下。你总是想要向下舍入,因为它是日期时间,如果你需要减少一分钟,你需要嘲笑:

IF datepart(second, @snapshotdatetime) > 29 
OR (datepart(second, @snapshotdatetime) = 29 
    AND datepart(millisecond, @snapshotdatetime) > 998)
SET @FromDateTime = DATEADD(minute, -1, @FromDateTime)

SET @ToDateTime = DATEADD(minute, 1, @FromDateTime)

然后,在你的where子句中,使用:

invoice.snapshot_datetime <= @FromDateTime 
AND invoice.snapshot_datetime >= @ToDateTime

答案 1 :(得分:0)

如果您还没有找到解决方案,请尝试以下方法:

select (convert(varchar,GETDATE(),112))

它将返回20180206(yyymmdd)