什么是在日期(没有时间)处理SQL查询的最佳方法?

时间:2012-12-21 21:27:32

标签: sql sql-server datetime ado.net

我们的数据库中有日期列,就像出生日期一样。但是,SQL Server将它们存储为日期和时间。时间和记录中的时间有各种各样的值(不知道它是如何以这种方式结束的。)

问题是人们将对所有birthdates <= {some date}运行查询,并且不会返回相同的查询,因为设置为给定日期的DateTime(使用ADO.NET)的时间为午夜。

我明白发生了什么。问题是如何最好地处理这个问题。我们可以在23:23:59.999999999的时间内强制执行该日期,但感觉它会有问题。

处理此问题的最佳标准是什么?

4 个答案:

答案 0 :(得分:7)

只需将1天添加到{some_date}并使用小于比较。请确保它是第二天早上12点......

答案 1 :(得分:3)

如果您需要经常查询,我可能会添加一个计算的,持久的列,将您的DATETIME强制转换为DATE(假设您使用的是SQL Server 2008 或更新):

ALTER TABLE dbo.YourTableName
ADD JustDay AS CAST(YourDateTimeColumn AS DATE) PERSISTED

这样,您现在可以在JustDay上查询它只是一个DATE - 没有涉及时间部分。由于它是计算出来的,所以不需要经常更新它; SQL Server将自动为您执行此操作。而且由于它是持久的,它是表的磁盘结构的一部分,并且与任何其他列的查询一样快 - 如果需要,它甚至可以被索引。

这是一个经典的空间 - vs - 速度权衡 - 因为你现在也存储了所有生日的日期部分,你的磁盘结构也会更大;另一方面,由于您有一个可以编入索引的漂亮的仅限日期的列,因此您可以很好地加快搜索速度。

答案 2 :(得分:1)

你说

  

问题是人们将对所有生日进行查询&lt; = {some   日期}

您可以保留原样并确保人们通过在WHERE子句中使用以下内容来摆脱时间:

CONVERT(DATETIME,CONVERT(CHAR(8),birthdates,112))<= {some date} 

..或更高版本的SQL-Server:

CONVERT(DATE,birthdates)<= {some date} 

但这是一种解决方法,最好采取其他建议并摆脱实际目标数据中的时间。

答案 3 :(得分:0)

还有一个选择:

DATEDIFF(d, birthdates, {some date}) <= 0