【问题标题】:SQL statement to select all rows from previous daySQL 语句选择前一天的所有行
【发布时间】:2010-12-02 23:07:08
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    目前无法测试,但是:

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

    【讨论】:

      【解决方案2】:

      在 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 点,而是从您运行查询的时间开始
      • 我的错误。我没有看到您正在处理 SQL Server 2005。事实上,我的代码仅适用于 SQL Server 2008。
      • 我一直认为 DATEADD(day,....) 是浪费,只是在日期上加上或减去天数:SELECT GETDATE()-1
      【解决方案3】:

      今天没有时间:

      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 * 将返回带有原始时间的任何日期。
      • datediff 给出“参数计数错误”。 stackoverflow.com/a/18926156/3007408 说 datediff 只能使用 2 个参数。有什么解决办法??
      • @Sp0T,这个问题被标记为 SQL Server,它有一个 DATEDIFF() 函数,它接受三个参数 (msdn.microsoft.com/en-us/library/ms189794.aspx) 你链接到的问题是针对 MySql,我猜它的工作方式与您发现的不同。你会发现 SQL 并不是完全可以互换的,不同厂商之间有很多这样的差异,尤其是在日期处理方面。
      • 哦,谢谢。不知道那个。顺便说一句,我通过使用“在 curdate() -1 天和 curdate() 之间”解决了这个问题。在这种情况下也可以使用它。
      • @RasmusBidstrup,是的。当我运行SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0) 时,我得到:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:
        SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);
        

        【讨论】:

        • 这是赢家。
        【解决方案6】:

        另一种方式告诉它“昨天”...

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

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

        【讨论】:

          【解决方案7】:

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

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

          这可以很容易地更改为今天、上个月、去年等。

          【讨论】:

          • 这个工作得很好,但与DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 相比要贵得多,因为它必须评估每一行的 DATEDIFF()
          【解决方案8】:

          应该这样做:

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

          【讨论】:

          • (对不起)但你的答案只兼容 MySQL,问题是针对 SQL Server
          【解决方案9】:

          在 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)
          

          【讨论】:

            【解决方案10】:

            嗯,将日期时间列转换为日期比比较更容易。

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

            【讨论】:

              【解决方案11】:

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

              Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
              

              【讨论】:

                【解决方案12】:

                一个简单的选择

                Select GETDATE() - 1
                

                更改 1 以返回那么多天数

                PS:这为您提供时间戳准确性。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-01-23
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多