2

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

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

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

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

4

4 回答 4

7

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

于 2012-12-21T21:32:23.777 回答
3

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

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

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

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

于 2012-12-21T21:45:43.203 回答
1

你说

问题是人们会查询所有的生日 <= {some date}

您可以保持原样,并确保人们通过在他们的WHERE条款中使用类似以下内容来摆脱时间:

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

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

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

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

于 2012-12-22T13:08:30.387 回答
0

另一种选择是:

DATEDIFF(d, birthdates, {some date}) <= 0
于 2012-12-21T21:37:37.160 回答