Datetime在where子句中

如何在SQL的where子句中select12/20/2008?

服务器是SQL Server 2005。

 select * from tblErrorLog where errorDate = '12/20/2008' 
 WHERE datetime_column >= '20081220 00:00:00.000' AND datetime_column < '20081221 00:00:00.000' 

首先,我build议使用ISO-8601标准格式的date/时间 – 无论SQL Server的语言和区域设置如何,它都可以工作。 ISO-8601是YYYYMMDD格式 – 没有空格,没有破折号 – 只是数据:

 select * from tblErrorLog where errorDate = '20081220' 

其次,你需要知道SQL Server 2005 DATETIME总是包含一个时间。 如果您只查看与date部分完全匹配的内容,则只会获得与时间0:00:00相匹配的行 – 没有其他内容。

您可以使用任何提及的推荐范围查询,或者在SQL Server 2008中,您可以使用DATE唯一date时间 – 或者可以执行如下所示的检查:

 select * from tblErrorLog where DAY(errorDate) = 20 AND MONTH(errorDate) = 12 AND YEAR(errorDate) = 2008 

哪个最适合你。

如果您经常需要执行此查询,则可以尝试将DATETIME标准化为只包含date,或者可以为DAY,MONTH和YEAR添加计算列:

 ALTER TABLE tblErrorLog ADD ErrorDay AS DAY(ErrorDate) PERSISTED ALTER TABLE tblErrorLog ADD ErrorMonth AS MONTH(ErrorDate) PERSISTED ALTER TABLE tblErrorLog ADD ErrorYear AS YEAR(ErrorDate) PERSISTED 

然后你可以更容易地查询:

 select * from tblErrorLog where ErrorMonth = 5 AND ErrorYear = 2009 

等等。 由于这些字段是计算和持续的,所以它们始终保持最新,并始终保持最新状态,并且由于它们已经过期,所以如果需要的话,甚至可以对它们进行索引。

你不会说你正在使用哪个数据库,但是在MS SQL Server中是这样的

 WHERE DateField = {d '2008-12-20'} 

如果是时间戳字段,则需要一个范围:

 WHERE DateField BETWEEN {ts '2008-12-20 00:00:00'} AND {ts '2008-12-20 23:59:59'} 

假设我们正在谈论SQL Server DateTime

注意:BETWEEN包含范围的两端,所以在技术上这种模式将是错误的:

 errorDate BETWEEN '12/20/2008' AND '12/21/2008' 

我喜欢的时间范围的方法是:

 '20081220' <= errorDate AND errordate < '20081221' 

与常用索引(范围扫描,SARGable,无函数)一起工作,并在不依赖SQL Server的时间粒度(例如23:59:59.997)

使用转换函数获取特定日子的所有条目。

 Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008' 

有关更多信息,请参阅CAST和CONVERT

 select * from tblErrorLog where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')