我在SSRS报告中使用以下查询 (此查询在SQL Server中工作正常,问题仅在SSRS报告中) --DECLARE @Range Number = 10; SELECT * FROM TBL1 WHERE USERNAME =' MIKE' 和 ( @Range =' 10' 和 转换(datetime,MyDate,120)< = GETDATE() ) 要么 ( @Range IN(' 20',' 30') 和 DATEDIFF(DD,转换(datetime,MyDate,120),GETDATE())< = @Range )
不幸的是,来自数据库的myDate列是一个varchar列。
SSRS会引发超出范围的异常。
然后我尝试将Getdate转换为Convert(varchar(10), getdate(), 120)
并与myDate进行比较(没有转换,因为myDate已经是YYYY-MM-DD格式但是作为数据库中的varchar)它仍然会抛出错误。我假设这次coz SSRS无法在varchar列中处理datediff。
当我单独运行这些查询时,它运行正常。即 -
Declare @Range Number = 10;
Select * from tbl1
where username = 'MIKE' and
(
@Range = '10'
and
convert(datetime, MyDate, 120) <= getdate()
有没有人在SSRS中遇到过类似的问题?
答案 0 :(得分:0)
试试这个!
SELECT * FROM TBL1 WHERE
USERNAME = 'MIKE'
AND
(
@Range = '10'
and
cast(myDate as datetime) <= GETDATE()
)
or
(
@Range IN ('20','30')
and
cast(myDate as datetime) , GETDATE()) <= @Range
)
答案 1 :(得分:0)
据推测,您的问题是myDate
的某些值格式不正确。如果您使用的是更新版本的SQL Server,则函数try_convert()
可以提供很大的帮助。
失败的原因是因为你的逻辑。 or
之后的第二个条件是查看所有记录,而不仅仅是Mike。我认为您打算将where
子句作为:
SELECT *
FROM TBL1 WHERE
WHERE USERNAME = 'MIKE' AND
((@Range = '10' and Convert(datetime, MyDate, 120) <= GETDATE()
) or
(@Range IN ('20','30') and
DATEDIFF(DD, Convert(datetime, MyDate, 120) , GETDATE()) <= @Range
)
);
请注意额外的括号。现在,这可能对MIKE
的特定查询有所帮助。但它不会对整体有所帮助。找到转换失败的价值可能令人生畏。如果你很幸运,他们很容易失败。您可以从以下开始查找它们:
select MyDate
from tbl1
where MyDate not like '[0-9][0-9][0-9][0-9]-[0-2][0-9]-[0-3][0-9]%';
如果你很幸运,那么这将找到有问题的价值观。否则,您必须更深入地了解日期格式,查看特定的月份和日期(以及可能的小时,分钟和秒)值。
道德:将日期存储为日期。不要将它们存储为varchar()
。