SQL:在WHERE子句中使用函数将日期转换为datetime

时间:2019-07-17 23:55:53

标签: sql sql-server datetime reporting-services where-clause

我有几个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语句而不是使用函数吗?

2 个答案:

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