我有针对SQL Server日期时间字段的共享数据集查询生成的SSRS日期/时间参数。该参数在报表文本框中正确显示,但在嵌入式数据集查询中无效,即使是与生成日期时间值的表相同也是如此。
为了将参数用于数据集查询,我必须解析where子句的两边以使其在SSDT中的预览中起作用:
(convert(varchar,invoice.snapshot_datetime,120)) = (convert(varchar,@snapshotdatetime,120))
这非常低效。
如何在不解析invoice.snapshot_datetime
列的情况下使我的where子句工作?
服务器详细信息
dateformat
为mdy
(来自dbcc useroptions
)。Getdate()
在SSMS中返回'2015-05-20 10:27:56.687'
答案 0 :(得分: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秒,则向下。你总是想要向下舍入,因为它是从日期时间,如果你需要减少一分钟,你需要嘲笑:
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)