我们的数据库中有日期列,就像出生日期一样。但是,SQL Server将它们存储为日期和时间。时间和记录中的时间有各种各样的值(不知道它是如何以这种方式结束的。)
问题是人们将对所有birthdates <= {some date}
运行查询,并且不会返回相同的查询,因为设置为给定日期的DateTime
(使用ADO.NET)的时间为午夜。
我明白发生了什么。问题是如何最好地处理这个问题。我们可以在23:23:59.999999999的时间内强制执行该日期,但感觉它会有问题。
处理此问题的最佳标准是什么?
答案 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