where子句中的日期时间

Nov*_*per 54 sql sql-server datetime sql-server-2005 filter

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

服务器是SQL Server 2005.

select * from tblErrorLog
where errorDate = '12/20/2008'
Run Code Online (Sandbox Code Playgroud)

Luk*_*keH 74

WHERE datetime_column >= '20081220 00:00:00.000'
  AND datetime_column < '20081221 00:00:00.000'
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,如果你使用这种方法,日期应该是'2008-20-12'.(YYYY-DD-MM).如果使用{ts}标识符,这将是正确的格式. (3认同)

mar*_*c_s 24

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

select * from tblErrorLog
where errorDate = '20081220'
Run Code Online (Sandbox Code Playgroud)

其次,您需要知道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
Run Code Online (Sandbox Code Playgroud)

哪个最适合你.

如果您经常需要执行此查询,则可以尝试将其标准化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
Run Code Online (Sandbox Code Playgroud)

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

select * from tblErrorLog
where ErrorMonth = 5 AND ErrorYear = 2009
Run Code Online (Sandbox Code Playgroud)

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


J__*_*J__ 16

你没有说你正在使用哪个数据库,但在MS SQL Server中它会是

WHERE DateField = {d '2008-12-20'}
Run Code Online (Sandbox Code Playgroud)

如果它是时间戳字段,那么您将需要一个范围:

WHERE DateField BETWEEN {ts '2008-12-20 00:00:00'} AND {ts '2008-12-20 23:59:59'}
Run Code Online (Sandbox Code Playgroud)


onu*_*ade 7

假设我们正在谈论SQL Server DateTime

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

errorDate BETWEEN '12/20/2008' AND '12/21/2008'
Run Code Online (Sandbox Code Playgroud)

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

'20081220' <= errorDate AND errordate < '20081221'
Run Code Online (Sandbox Code Playgroud)

使用常见索引(范围扫描,SARGable,无功能)并在第二天的午夜正确剪辑,而不依赖于SQL Server的时间粒度(例如23:59:59.997)


Mid*_*one 5

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

Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008'
Run Code Online (Sandbox Code Playgroud)

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