如何显示前一天的数据,直到11:59 PM或12,
我正在使用 getdate()
运行查询,然后显示当前日期为当前时间
例如
Execution Datetime -2018-10-11 15:08:42.777
但是如果我想要昨天的数据直到晚上11:59或我使用的12
dateadd(day,-1, getdate()), or Getdate()-1
,它显示的时间完全相同
2018-10-10 15:08:42.777
如何获取前一天的数据,直到11:59 pm
答案 0 :(得分:1)
我建议:
where col < cast(getdate() as date) and
col >= dateadd(day, -1, cast(getdate() as date))
如果有合适的索引,则这种表达方式允许SQL Server在col
上使用索引。
如果您不关心索引,可以执行以下操作:
where datediff(day, col, getdate) = 1
答案 1 :(得分:0)
您可以尝试以下操作。
WHERE dateField < convert(date, getdate() -1)
答案 2 :(得分:0)
您可以结合使用DATEDIFF
和DATEADD
来获得两个值,一个在昨天的00:00:00,另一个在昨天的23:59:59。无需转换为DATE,速度非常快。
DATEADD(DAY,-1, DATEDIFF(DAY,0,getdate()))
昨天给您00:00:00
DATEADD(MILLISECOND,-3,DATEADD(DAY,0, DATEDIFF(DAY,0,getdate())))
昨天给您23:59:59.997
在要过滤到昨天的查询的WHERE
中,此示例
SELECT *
FROM Sometable
WHERE Sometable.Datecolumn BETWEEN
DATEADD(DAY,-1, DATEDIFF(DAY,0,getdate())) AND DATEADD(MILLISECOND,-3,DATEADD(DAY,0, DATEDIFF(DAY,0,getdate())))
答案 3 :(得分:-1)
您可以将值和都强制转换为date
,例如:
where cast(dateTimeField as date) =cast(dateadd(day,-1,getdate()) as date)
SQL Server非常聪明,可以将其转换为范围查询:
WHERE dateField >= '2018-10-10 00:00:00' and datefield <'2018-10-11 00:00:00`
这允许服务器使用覆盖dateField
的所有索引并执行快速查询。
在任何其他情况下,将函数应用于字段将阻止服务器使用索引
更新
对于怀疑者和不确定者,让我们创建一个包含50K条目的表:
create table TestDates(
id int primary key identity,
Name nvarchar(20),
Created datetime,
INDEX IX_TestDates_Created(Created)
);
insert into TestDates(Name,Created)
select FORMAT(n,'John Doe {0}'), dateadd(hour,n,'2017-08-01 16:55:47')
from Numbers
where n<=50000
这将创建5万个条目,直到2023年,每天有24个条目。
此查询的执行计划:
select count(*),min(created),max(created)
from TestDates
where cast(created as date)=cast(dateadd(day,-1,getdate()) as date)
在索引上显示索引查找,而不是扫描。
索引查找操作的查找谓词是:
Start: [Test].[dbo].[TestDates].Created > Scalar Operator([Expr1012]),
End: [Test].[dbo].[TestDates].Created < Scalar Operator([Expr1013])
有结果:
24 2018-10-11 00:55:47.000 2018-10-11 23:55:47.000