我们的数据库中有日期列,它们就像出生日期一样。但是,SQL Server将它们存储为日期&时间和记录中的时间有不同的值(不知道它是如何结束的)。
问题是人们将对所有birthdates <= {some date}
运行查询,而那些相等的不会返回,因为DateTime
(使用ADO.NET)设置为给定日期的时间为午夜。
处理这种情况的标准最佳实践是什么?
只需将1天添加到{some_date}并使用小于比较。只要确保是在第二天凌晨12点……
如果您需要经常查询,我可能会添加一个计算,持久列,将您的DATETIME
转换为DATE
(假设您在SQL Server 2008或更新):
ALTER TABLE dbo.YourTableName
ADD JustDay AS CAST(YourDateTimeColumn AS DATE) PERSISTED
这样,你现在可以查询JustDay
,它只是一个DATE
-没有时间部分涉及。既然它是计算出来的,就不需要不断地更新它;SQL Server将自动为您完成此操作。由于它是持久化的,所以它是表的磁盘结构的一部分,并且与对任何其他列的查询一样快——如果需要的话,它甚至可以被索引。
这是一个经典的空间vs速度权衡——因为你现在也在存储你所有生日的日期部分,你的磁盘结构将更大;另一方面,由于您有一个可以被索引的漂亮的、只有日期的列,因此您有了一个加快搜索速度的好方法。
你说
问题是人们会查询所有的生日<= {some日期}
你可以让它保持原样,并确保人们通过在他们的WHERE
子句中使用以下内容来摆脱时间:
CONVERT(DATETIME,CONVERT(CHAR(8),birthdates,112))<= {some date}
. .或更高版本的SQL-Server:
CONVERT(DATE,birthdates)<= {some date}
但这是一种变通方法,最好采纳其他建议,去掉实际目标数据中的时间
还有一个选项是:
DATEDIFF(d, birthdates, {some date}) <= 0