SQL DateTime> =和< =表现不佳

时间:2015-01-20 10:29:53

标签: sql-server

我尝试以以下形式向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'但确实会修复它,但我不希望用户这样做,如果为两者选择相同的日期,它应该有效。

如何解决这个问题?

3 个答案:

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

SSRS IIF Date evaluation

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/87c519e2-93cd-4bea-85ed-98b2dc885b78/how-will-i-compare-two-dates-in-ssrs-2005?forum=sqlreportingservices

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