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

149

我正在寻找一条好的 SQL 语句,以选择一个表中前一天的所有行。该表包含一个日期时间列。我使用的是 SQL Server 2005。

13个回答

259

获取今天的时间:

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.
@Sp0T,这个问题标记为SQL Server,它有一个接受三个参数的DATEDIFF()函数(https://msdn.microsoft.com/en-us/library/ms189794.aspx),你链接的那个问题是针对MySql的,我猜它的工作方式不同,正如你所发现的。你会发现SQL并不完全可互换,不同供应商之间存在许多类似于日期处理的差异。 - KM.
哦,谢谢。不知道那个。顺便说一下,我通过使用“between curdate() -1 day and curdate()”解决了这个问题。或许在这种情况下也可以用。 - Sp0T
每个月的第一天都能用这个方法找到“昨天”吗?例如2016-02-01会变成2016-01-31吗? - Bidstrup
2
@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.
显示剩余2条评论

60

获取 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点到12点,而是从运行查询的时间开始。 - rudimenter
1
我的错误。我没有看到你正在处理SQL Server 2005。实际上,我的代码仅适用于SQL Server 2008。 - Konamiman
我一直认为DATEADD(day,....)是浪费,只需对日期加减天数即可:SELECT GETDATE()-1 - KM.

20

似乎显而易见的答案被忽略了。要获取表(Ttable)中所有数据,并且其中一列(DatetimeColumn)是带时间戳的日期时间,可以使用以下查询:

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

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


7
这个方法运行得相当不错,但是与DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)相比要贵得多,因为它需要在每一行上计算DATEDIFF()函数。 - Václav Holuša

13
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);

这是获胜者。 - TmsKtel

5

这是一个很旧的帖子,但我对此有自己的看法。与其使用两个不同的从属句,一个大于和一个小于,我使用以下语法从一个日期中选择记录。如果你想要一个日期范围,那么之前的答案是正确的。

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

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

4
这应该可以解决问题:
WHERE `date` = CURDATE() - INTERVAL 1 DAY

1
抱歉,您的答案只适用于MySQL,而问题是针对SQL Server的。 - Stefan Collier

3

暂时无法进行测试,但是:

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

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)

0

嗯,将日期时间列转换为日期然后进行比较会更容易。

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

0

一种简单的替代方案

Select GETDATE() - 1

将数字1更改为返回相应天数的数量

附注:这将给您时间戳的准确性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接