在SQL Server中无需时间比较日期的最佳方法

Ali*_*Ali 20 sql sql-server datetime utc

select * from sampleTable 
where CONVERT(VARCHAR(20),DateCreated,101) 
=     CONVERT(VARCHAR(20),CAST('Feb 15 2012  7:00:00:000PM' AS DATETIME),101)
Run Code Online (Sandbox Code Playgroud)

我想没有时间比较日期

以上查询还可以吗?或者你建议其他更好的解决方案

  • 我正在使用SQL Server 2005
  • 在服务器上以UTC格式保存的日期
  • 针对此数据的用户属于不同的时区

Mar*_*ell 26

不要使用转换 - 无缘无故涉及字符串.一个技巧是日期时间实际上是一个数字,而日期是整数部分(时间是小数部分); 因此,这一天是价值的FLOOR:这只是数学,而不是字符串 - 更快

declare @when datetime = GETUTCDATE()
select @when -- date + time
declare @day datetime = CAST(FLOOR(CAST(@when as float)) as datetime)
select @day -- date only
Run Code Online (Sandbox Code Playgroud)

在您的情况下,无需转换回日期时间; 并使用范围允许最有效的比较(特别是如果索引):

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
Run Code Online (Sandbox Code Playgroud)


小智 22

Simple Cast Date将解决问题.

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
Run Code Online (Sandbox Code Playgroud)


dkn*_*ack 6

描述

不要将您的 Date 转换为 varchar 并进行比较,因为字符串比较并不快。

如果您使用>=<过滤您的DateCreated列,速度会快得多。

如果您没有参数(如您的示例中的字符串),则应使用 ISO 格式<Year><Month><Day>

样本

根据您的样品

DECLARE @startDate DateTime
DECLARE @endDate DateTime

SET @startDate = '20120215'
SET @endDate = DATEADD(d,1,@startDate)

SELECT * FROM sampleTable 
WHERE DateCreated >= @startDate AND DateCreated < @endDate
Run Code Online (Sandbox Code Playgroud)

更多信息


小智 5

SELECT .......
FROM ........
WHERE 
CAST(@DATETIMEVALUE1 as DATE) = CAST(@DATETIMEVALUE2 as DATE)
Run Code Online (Sandbox Code Playgroud)

缺点是您正在转换过滤器列。

如果过滤器列上有索引,则由于您正在强制转换,因此SQL引擎将无法再使用索引更有效地过滤日期。