SSRS中的日期时间转换/日期差异

时间:2014-07-13 15:05:16

标签: sql datetime reporting-services casting

我在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中遇到过类似的问题?

2 个答案:

答案 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()