Where 条款中的日期时间

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

服务器是 SQL Server 2005。

select * from tblErrorLog
where errorDate = '12/20/2008'
544823 次浏览

你没有说你正在使用的数据库,但在 MSSQLServer 它会

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

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

WHERE DateField BETWEEN {ts '2008-12-20 00:00:00'} AND {ts '2008-12-20 23:59:59'}
WHERE datetime_column >= '20081220 00:00:00.000'
AND datetime_column < '20081221 00:00:00.000'
select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')

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

select * from tblErrorLog
where errorDate = '20081220'

其次,您需要知道 SQLServer2005DATETIME总是包含一个时间。如果只使用日期部分检查精确匹配,那么只会得到匹配时间为0:00:00的行-没有其他内容。

您可以使用上面提到的任何推荐范围查询,或者在 SQLServer2008中,您可以使用 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

等等。因为这些字段是计算和 PERSISTED 的,所以它们总是最新的并且总是当前的,而且因为它们是持久化的,所以如果需要的话,您甚至可以对它们进行索引。

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

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

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

假设我们说的是 SQLServer 日期时间

注意: 两端包括 都有的范围,所以技术上这个模式将是错误的:

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

对于这样的时间范围,我的首选方法是:

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

使用常见的索引(范围扫描、可搜索、无功能) ,并且不依赖于 SQL Server 的时间粒度(例如23:59:59.997) ,正确地截断第二天午夜的时间

使用下面的查询,以便更清楚地理解

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT *
FROM [dbo].[PublishedInfo]
where PublishedDate >= '2022-02-14T11:31:16.5299166+00:00'