我有几个SSRS报告,用户必须在其中输入日期范围,并且该报告需要起作用,无论是否包含时间戳记。
我知道,当SQL日期中不包含时间戳时,假定为'00:00:00.000'
,因此,例如,在搜索订单WHERE orderDate BETWEEN '2019-01-01' AND '2019-01-02'
时,它将不包含2019年的任何订单-01-02。我不能简单地使用DATEADD(d, 1, @endDate)
或CONVERT(date, orderDate)
,因为用户可能已经输入了自己想要保持真实的时间戳值。
如果用户在其日期范围的末尾输入简单日期,则需要将其转换为datetime值。由于我经常这样做,所以我创建了一个名为dbo.DateToDatetime
的函数,该函数传递输入的日期,检查它是否有时间戳,如果没有,则添加自己的时间戳值'23:59:59.997'
:>
SELECT @datetime = CASE WHEN CONVERT(time, @date) = '0:0:0' THEN @date + '23:59:59.997' ELSE @date END
我经常在WHERE
子句中使用此函数,如下所示:
WHERE orderDate BETWEEN @startDate AND dbo.DateToDatetime(@endDate)
通常,我知道在WHERE
子句中使用函数是不好的做法,并且我担心这会对查询效率产生影响。有更好的解决方案吗?最好每次都键入case语句而不是使用函数吗?
答案 0 :(得分:0)
我建议使用IF语句是连接到SSRS参数的SQL,该标志会标记输入是否带有时间戳,然后以where子句的正确格式执行所选的SQL select语句。 另外-您可以在SSRS表达式中编写SQL语句,然后通过exec @sql
将其“注入”到where子句中答案 1 :(得分:-2)
您可以使用强制转换以获得正确的输出
CAST(orderDate as date) BETWEEN CAST(@startDate as date) and CAST(@endDate as date)