SQL语句以选择前一天的所有行


120

我正在寻找一个好的SQL语句以从一个表中选择前一天的所有行。该表包含一个datetime列。我正在使用SQL Server 2005。

Answers:


211

今天没有时间:

SELECT dateadd(day,datediff(day,0,GETDATE()),0)

昨天没有时间:

SELECT dateadd(day,datediff(day,1,GETDATE()),0)

查询仅昨天的所有行:

select 
    * 
    from yourTable
    WHERE YourDate >= dateadd(day,datediff(day,1,GETDATE()),0)
        AND YourDate < dateadd(day,datediff(day,0,GETDATE()),0)

@ashuthinks,您的评论对我没有任何意义。原始问题询问如何从前一天获取行。为此,您需要仅获取今天的日期(无时间)和只有昨天的日期(无时间)。您可以在WHERE子句中使用这些(永恒的)日期。但是,SELECT *会返回带有原始时间的任何日期。
KM。

datediff给出“错误的参数计数错误”。和stackoverflow.com/a/18926156/3007408说datediff只能使用2个参数。任何解决方案?
Sp0T

@ Sp0T,此问题标记为SQL Server,它具有一个DATEDIFF()函数,该函数接受三个参数(msdn.microsoft.com/en-us/library/ms189794.aspx),您链接到的问题是MySql的,我猜与您发现的方式不同。您会发现SQL不能完全互换,不同供应商之间存在许多类似的差异,尤其是在日期处理方面。
KM。

哦,谢谢。不知道 顺便说一句,我通过使用“介于curdate()-1天和curdate()之间”解决了这个问题。也可以在这种情况下使用它。
Sp0T 2015年

1
@RasmusBidstrup,是的。当我跑步时,SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)我得到:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
KM。

44

要在SQL中获取“今天”值:

convert(date, GETDATE())

要获取“昨天”:

DATEADD(day, -1, convert(date, GETDATE()))

要获得“今天减去X天”:将-1更改为-X。

因此,对于昨天的所有行,您将获得:

select * from tablename
   where date >= DATEADD(day, -1, convert(date, GETDATE()))
   and date < convert(date, GETDATE())

“ date”数据类型在SQL Server 2005中不存在。当我使用datetime代替时,时间值保持不变,并且计算发生的时间不是从凌晨0点到12pm,而是从您运行查询的时间
rudimenter

1
我的错。我没有看到您正在使用SQL Server2005。确实,我的代码仅适用于SQL Server 2008。
Konamiman

我一直以为DATEADD(day,....)是浪费,只需将日期加上或减去天数: SELECT GETDATE()-1
KM。

18

似乎没有答案。要从表(Ttable)中获取所有数据,该表的列(DatetimeColumn)是带有时间戳的日期时间,可以使用以下查询:

SELECT * FROM Ttable
WHERE DATEDIFF(day,Ttable.DatetimeColumn ,GETDATE()) = 1 -- yesterday

可以轻松地将其更改为今天,上个月,去年等。


3
这一次工作得很好,但更昂贵相比DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0),因为它必须评估各行上DATEDIFF()
瓦茨拉夫·霍卢沙


5

它是一个非常老的线程,但这是我的看法。而不是2个不同的子句,一个大于和小于。我使用以下语法从A日期中选择记录。如果您想要一个日期范围,则可以使用以前的答案。

SELECT * FROM TABLE_NAME WHERE 
DATEDIFF(DAY, DATEADD(DAY, X , CURRENT_TIMESTAMP), <column_name>) = 0

在上述情况下,昨天的记录X将为-1


4

目前无法测试,但是:

select * from tablename where date >= dateadd(day, datediff(day, 1, getdate()), 0) and date < dateadd(day, datediff(day, 0, getdate()), 0)

3

应该这样做:

WHERE `date` = CURDATE() - INTERVAL 1 DAY

1
(对不起),但您的答案仅与MySQL兼容,问题是针对SQL Server
StefanJCollier,

2

在SQL Server中执行以下操作:

where cast(columnName as date) = cast(getdate() -1 as date)

您应该将表达式的两边都强制转换为最新日期,以避免时间格式出现问题。

如果您需要更详细地控制间隔,则应尝试以下操作:

declare @start datetime = cast(getdate() - 1 as date)
declare @end datetime = cast(getdate() - 1 as date)
set @end = dateadd(second, 86399, @end)

1

另一种说法是“昨天” ...

Select * from TABLE
where Day(DateField) = (Day(GetDate())-1)
and Month(DateField) = (Month(GetDate()))
and Year(DateField) = (Year(getdate()))

可以想象,这在1月1日以及每个月的第一天都无法正常运行。但是它是有效的。


1

好吧,将datetime列转换为日期并比比较容易。

SELECT * FROM TABLE_NAME WHERE cast(COLUMN_NAME as date) = 
   dateadd(day,0, convert(date, getdate(), 105)) 

0

subdate(now(),1)将返回昨天的时间戳下面的代码将选择所有带有昨天时间戳的行

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.