首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在SQL Server中比较不带时间的日期的最佳方法

在SQL Server中比较不带时间的日期的最佳方法
EN

Stack Overflow用户
提问于 2012-02-16 17:29:58
回答 7查看 103.4K关注 0票数 37
代码语言:javascript
复制
select * from sampleTable 
where CONVERT(VARCHAR(20),DateCreated,101) 
=     CONVERT(VARCHAR(20),CAST('Feb 15 2012  7:00:00:000PM' AS DATETIME),101)

我想比较不带时间的日期

上面的查询可以吗?或您建议的其他更好的解决方案

  • 我使用的是SQL Server2005
  • 服务器上以UTC格式保存的日期
  • 用户对此数据所属的时区不同
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-02-16 17:39:37

不要使用convert -它会无缘无故地涉及到字符串。一个诀窍是,日期时间实际上是一个数字,而天是整数部分(时间是小数部分);因此,天是该值的FLOOR:这只是数学问题,而不是字符串-要快得多

代码语言:javascript
复制
declare @when datetime = GETUTCDATE()
select @when -- date + time
declare @day datetime = CAST(FLOOR(CAST(@when as float)) as datetime)
select @day -- date only

在您的例子中,不需要转换回日期时间;使用范围可以实现最有效的比较(特别是在索引的情况下):

代码语言:javascript
复制
declare @when datetime = 'Feb 15 2012  7:00:00:000PM'
declare @min datetime = FLOOR(CAST(@when as float))
declare @max datetime = DATEADD(day, 1, @min)

select * from sampleTable where DateCreated >= @min and DateCreated < @max
票数 34
EN

Stack Overflow用户

发布于 2016-04-11 23:13:15

简单地转换为Date就可以解决这个问题。

代码语言:javascript
复制
DECLARE @Date datetime = '04/01/2016 12:01:31'

DECLARE @Date2 datetime = '04/01/2016'

SELECT CAST(@Date as date)

SELECT CASE When (CAST(@Date as date) = CAST(@Date2 as date)) Then 1 Else 0 End
票数 46
EN

Stack Overflow用户

发布于 2014-08-20 01:52:29

代码语言:javascript
复制
SELECT .......
FROM ........
WHERE 
CAST(@DATETIMEVALUE1 as DATE) = CAST(@DATETIMEVALUE2 as DATE)

缺点是您正在强制转换筛选器列。

如果筛选列上有索引,则由于是强制转换,因此SQL引擎不能再使用索引来更有效地筛选日期。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9308635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档