什么是处理日期(没有时间)上的sql查询的最好方法?



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

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

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

处理这种情况的标准最佳实践是什么?

只需将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

相关内容

  • 没有找到相关文章

最新更新