where子句中的日期时间

时间:2009-12-22 16:22:56

标签: sql sql-server datetime sql-server-2005 filter

如何在sql的where子句中选择12/20/2008?

服务器是SQL server 2005。

select * from tblErrorLog
where errorDate = '12/20/2008'

6 个答案:

答案 0 :(得分:69)

WHERE datetime_column >= '20081220 00:00:00.000'
  AND datetime_column < '20081221 00:00:00.000'

答案 1 :(得分:22)

首先,我建议将ISO-8601标准格式用于日期/时间 - 无论SQL Server上的语言和区域设置如何,它都能正常工作。 ISO-8601是YYYYMMDD格式 - 没有空格,没有破折号 - 只是数据:

select * from tblErrorLog
where errorDate = '20081220'

其次,您需要注意SQL Server 2005 DATETIME总是包含时间。如果您只检查与日期部分的完全匹配,那么您将只获得与0:00:00时间匹配的行 - 没有别的。

您可以使用上面提到的任何推荐范围查询,或者在SQL Server 2008中,您可以使用DATE唯一的日期时间 - 或者您可以检查以下内容:

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

无论哪种方式最适合你。

如果您经常需要执行此查询,您可以尝试将DATETIME标准化为仅包含日期,也可以为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

等等。由于这些字段是计算和持久的,因此它们始终是最新的并且始终是最新的,并且由于它们是固定的,因此您甚至可以根据需要对它们进行索引。

答案 2 :(得分:12)

您没有说明您正在使用哪个数据库,但在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'}

答案 3 :(得分:7)

假设我们正在谈论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)

答案 4 :(得分:4)

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

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

有关详细信息,请参阅CAST and CONVERT

答案 5 :(得分:1)

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