sql-where子句中的Datetime

如何在sql的where子句中选择2008年12月20日?

该服务器是SQL Server 2005。

select * from tblErrorLog
where errorDate = '12/20/2008'
6个解决方案
73 votes
WHERE datetime_column >= '20081220 00:00:00.000'
  AND datetime_column < '20081221 00:00:00.000'
LukeH answered 2020-01-12T18:53:33Z
24 votes

首先,我建议对日期/时间使用ISO-8601标准格式-无论SQL Server上的语言和区域设置如何,它都可以使用。 ISO-8601是DATETIME格式-无空格,无破折号-仅数据:

select * from tblErrorLog
where errorDate = '20081220'

其次,您需要了解SQL Server 2005 DATETIME始终包含一个时间。 如果仅检查日期部分是否完全匹配,您将仅获得时间为0:00:00匹配的行-别无其他。

您可以使用提及的任何推荐范围查询,或者在SQL Server 2008中,可以仅使用DATETIME日期时间-或可以进行类似以下检查:

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

等等。 由于这些字段是经过计算和持久化的,因此它们始终是最新的且始终是最新的,并且由于它们是持久性的,因此您甚至可以在需要时对其进行索引。

marc_s answered 2020-01-12T18:54:21Z
16 votes

您没有说要使用哪个数据库,但是在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'}
J__ answered 2020-01-12T18:54:45Z
7 votes

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

onupdatecascade answered 2020-01-12T18:55:18Z
5 votes

使用转换功能可获取特定日期的所有条目。

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

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

Middletone answered 2020-01-12T18:55:42Z
1 votes
select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')
Meff answered 2020-01-12T18:55:58Z
translate from https://stackoverflow.com:/questions/1947436/datetime-in-where-clause