我尝试以以下形式向SQL查询添加日期范围过滤器:
SELECT * FROM Database
WHERE
(CreatedOn >= '2015-01-14' AND
CreatedOn <= '2015-01-14')
这意味着我想从CreatedOn字段返回与14/01/2015匹配的所有行。
这回来了0行。
如果我将CreatedOn <= '2015-01-14'
更改为CreatedOn <= '2015-01-15'
但确实会修复它,但我不希望用户这样做,如果为两者选择相同的日期,它应该有效。
如何解决这个问题?
答案 0 :(得分:0)
这是我们非常普遍的做法,同时将日期时间字段与日期或字符串日期进行比较。可能是你得到了结果,原因是格式化和时间。
比较时,您应该丢弃时间部分,并为双方提供相同的日期格式。
SELECT * FROM Database
WHERE cast( CreatedOn as date) >= '2015-01-20'
and cast( CreatedOn as date) <= '2015-01-20'
or
SELECT * FROM Database
WHERE cast( CreatedOn as date) between ('2015-01-20' and '2015-01-20')
已更新: - 对于ssrs date compare
答案 1 :(得分:-1)
你可以写这样的查询
SELECT * FROM Database WHERE CreatedOn between T1 and T2
答案 2 :(得分:-2)
如果有毫秒
,这将无效SELECT * FROM Database
WHERE
(CreatedOn >= '2015-01-14 00:00:00' AND
CreatedOn <= '2015-01-14 23:59:59')
这将有效
SELECT * FROM Database
WHERE cast( CreatedOn as date) >= '2015-01-14')
and cast( CreatedOn as date) <= '2015-01-14')
但你可以简单地重写为
SELECT * FROM Database
WHERE cast( CreatedOn as date) = '2015-01-14'
但是这会将函数应用于参数,因此如果日期列SQL SERVER
上有索引,则不会使用这些索引。您可以阅读有关搜索参数(SARG)的信息。
请尝试以下
SELECT * FROM Database
WHERE
CreatedOn >= '2015-01-14' AND
CreatedOn < DATEADD(dd, 1, '2015-01-14')
你可以简单地替换2015-01-14&#39;这里有必要的参数,如
SELECT * FROM Database
WHERE
CreatedOn >= @Dt1 AND
CreatedOn < DATEADD(dd, 1, @Dt2)