首页 文章

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

提问于
浏览
0

我有一个SSRS报告,我在下面使用查询 .
(此查询在SQL Server中工作正常,问题仅在SSRS报告中) - DECLARE @Range Number = 10; SELECT * FROM TBL1 WHERE USERNAME = 'MIKE' AND(@Range = '10'和Convert(datetime,MyDate,120)<= GETDATE())或(@Range IN('20','30')和DATEDIFF(DD,Convert(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

    试试这个!

    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
        )
    
  • 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 的特定查询有所帮助 . 但它无济于事 . 找到转换失败的 Value 可能令人生畏 . 如果你很幸运,他们很容易失败 . 你可以从以下开始寻找它们:

    select MyDate
    from tbl1
    where MyDate not like '[0-9][0-9][0-9][0-9]-[0-2][0-9]-[0-3][0-9]%';
    

    如果你很幸运,那么这将找到有问题的 Value 观 . 否则,您将不得不深入研究日期格式,查看特定的月和日(以及可能的小时,分钟和秒)值 .

    道德:将日期存储为日期 . 不要将它们存储为 varchar() .

相关问题