【问题标题】:Why can't I use a datetime parameter in ssrs?为什么我不能在 ssrs 中使用 datetime 参数?
【发布时间】:2015-05-20 08:42:16
【问题描述】:

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

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

(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'

【问题讨论】:

  • 如果列和变量的数据类型相同,为什么还要转换呢?
  • 它在我的最后工作正常我已经使用 DateTime 参数创建了一个报告,它获取了我想要的数据在你的最后有一些其他问题。请不要用单引号传递参数值.
  • @ZoharPeled - 如果我不转换,那么两边就不相等
  • @ArunGairola - 我的参数是从共享数据集创建的。我已经更新了这个问题。传递的参数不带引号。
  • 您希望的时间分辨率是多少?您需要精确的秒数、分钟数、小时数还是日期?

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


【解决方案1】:

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

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

(感谢t-clausen.dk his answer here

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

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

因为如果小日期时间超过 29.998 秒,演员会向上取整,如果小于 29.999 秒,则向下取整。你总是想四舍五入,因为它是 From 日期时间,如果你需要减少一分钟,你需要检查一下:

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

【讨论】:

  • 谢谢,这是要求的。这将有助于提高性能。但我更喜欢使用 EQUALS 运算符。
  • 使用between...and 的目的是获得微小的结果。使用 = 将强制您像现在一样转换列或使用包括毫秒在内的确切时间。你不能一边吃蛋糕一边保存它......
  • 也许这就是问题的核心? SSRS 日期/时间参数不包含毫秒
【解决方案2】:

如果你还没有找到解决办法,试试这个:

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

它将返回 20180206 (yyymmdd)

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 2020-03-06
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多