仅从前一天恢复 SQL Server 表中的数据



>我需要从仅引用前一天日期的表中检索数据,我正在尝试执行以下查询,但没有得到:

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())

最新更新