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')