>我需要从仅引用前一天日期的表中检索数据,我正在尝试执行以下查询,但没有得到:
SELECT
Log.ValorEntrada, Log.DataHoraEvento, Log.NumeroEntrada
FROM
Log
WHERE
Log.DataHoraEvento = (GETDATE()-1)
我怎样才能得到这个结果?
在SQL Server中,GETDATE()
有一个时间组件。 我建议:
WHERE Log.DataHoraEvento >= CAST(GETDATE()-1 as DATE) AND
Log.DataHoraEvento < CAST(GETDATE() as DATE)
此条件是"可优化优化的",这意味着可以使用索引。 以下内容也是:
WHERE CONVERT(DATE, Log.DataHoraEvento) >= CONVERT(DATE, GETDATE())
几乎所有函数都阻止使用索引,但转换/强制转换为日期是一个例外。
最后,如果你不关心索引,你也可以把它写成:
WHERE DATEDIFF(day, Log.DataHoraEvento, GETDATE()) = 1
DATEDIFF()
以day
作为第一个参数计算两个日期/时间之间的"日"边界数。 昨天发生的一切都只有一个日期边界。
如果DataHoraEvento
是一个DATETIME
,它很可能有全职时间,因此GETDATE()-1
没有得到任何匹配。您应该搜索如下范围:
SELECT L.ValorEntrada, L.DataHoraEvento, L.NumeroEntrada
FROM dbo.[Log] L
WHERE L.DataHoraEvento >= CONVERT(DATE,DATEADD(DAY,-1,GETDATE()))
AND L.DataHoraEvento < CONVERT(DATE,GETDATE());
SELECT Log.ValorEntrada, Log.DataHoraEvento, Log.NumeroEntrada
FROM Log
WHERE Log.DataHoraEvento >= DATEADD(dd,DATEDIFF(dd,1,GETDATE()),0)
AND Log.DataHoraEvento < DATEADD(dd,DATEDIFF(dd,0,GETDATE()),0)
您还应该使用 SYSDATETIME(((如果您使用的是 SQL Server 2008+(而不是 GETDATE((,因为这会为您提供 datetime2(7( 精度。
你可以试试这个:
MEMBER BETWEEN DATEADD(day, -2, GETDATE()) AND DATEADD(day, -1, GETDATE())