我需要从仅包含前一天引用日期的表中检索数据,我正在尝试使用下面的查询,但我没有得到:
SELECT
Log.ValorEntrada, Log.DataHoraEvento, Log.NumeroEntrada
FROM
Log
WHERE
Log.DataHoraEvento = (GETDATE()-1)
我怎样才能得到这个结果?
答案 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)
如果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());
答案 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())