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

时间:2017-08-01 15:04:01

标签: sql sql-server

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

SELECT 
    Log.ValorEntrada, Log.DataHoraEvento, Log.NumeroEntrada 
FROM 
    Log 
WHERE 
    Log.DataHoraEvento = (GETDATE()-1)

我怎样才能得到这个结果?

4 个答案:

答案 0 :(得分:3)

在SQL Server中,GETDATE()有一个时间组件。我建议:

WHERE Log.DataHoraEvento >= CAST(GETDATE()-1 as DATE) AND
      Log.DataHoraEvento < CAST(GETDATE() as DATE)

这个条件是&#34; sargable&#34;,这意味着可以使用索引。以下也是:

WHERE CONVERT(DATE, Log.DataHoraEvento) >= CONVERT(DATE, GETDATE())

几乎所有函数都阻止使用索引,但转换/转换为日期是一个例外。

最后,如果您不关心索引,也可以将其写为:

WHERE DATEDIFF(day, Log.DataHoraEvento, GETDATE()) = 1
DATEDIFF()作为第一个参数的

day计算&#34; day&#34;两个日期/时间之间的界限。昨天发生的一切都只有一个日期边界。

答案 1 :(得分:1)

如果DataHoraEventoDATETIME,则可能是它有全部时间,因此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());

答案 2 :(得分:1)

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)精度。

答案 3 :(得分:0)

你可以试试这个:

MEMBER BETWEEN DATEADD(day, -2, GETDATE()) AND DATEADD(day, -1, GETDATE())