【问题标题】:MySQL Query to select data from last week?MySQL Query 选择上周的数据?
【发布时间】:2011-08-30 16:53:24
【问题描述】:

您好,我有一张带有日期字段和其他信息的表格。 我想选择过去一周的所有条目,(一周从星期日开始)。

表值:

id  date
2   2011-05-14 09:17:25
5   2011-05-16 09:17:25
6   2011-05-17 09:17:25
8   2011-05-20 09:17:25
15  2011-05-22 09:17:25

我想选择上周的所有 id,预期输出为 5、6、8。 (id 2 不在上周,id 15 在本周。)

如何写和SQL查询一样。

【问题讨论】:

  • 所以澄清一下,您需要从周日开始的数据,而不一定是 7 天的数据?因此,如果今天是星期一,您将获得 2 天的数据(星期日和星期一)?
  • 周日到周六。不会持续 7 天
  • 我现在不想将其实际转换为 SQL,但您可以在 Wikipedia 上找到一种算法来确定一周中的哪一天,然后使用它来决定回溯多远: en.wikipedia.org/wiki/…
  • @Brendan Long:他可以使用SELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1 数周,但我猜他的目标是不是真正的日历周。至少他没有提到像 ISO-8601 这样的技术,或者他是否希望考虑到今年的转变。
  • 对我来说答案是WHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY

标签: mysql sql database datetime


【解决方案1】:
select id from tbname
where date between date_sub(now(),INTERVAL 1 WEEK) and now();

【讨论】:

  • 如果你在 '2011-05-22' 运行它,这并不能解决 OP 问题,你会得到 id 15...
  • 这是最好的答案。
【解决方案2】:
SELECT id FROM tbl
WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY

【讨论】:

  • 您好,如何从周一到周日获取上周定义的周数
  • @Graph 是的,上面的 SQL 脚本将是这样的: SELECT id FROM tbl WHERE DATE > DATE_SUB(DATE(NOW()), INTERVAL DAYOFWEEK(NOW())+6 DAY) AND DATE
  • 返回最后 7 天而不是上周
【解决方案3】:
SELECT id FROM table1
WHERE YEARWEEK(date) = YEARWEEK(NOW() - INTERVAL 1 WEEK)

我专门使用 YEARWEEK 函数返回前一个完整的日历周(而不是今天之前的 7 天)。 YEARWEEK 还允许第二个参数设置一周的开始或确定如何处理一年中的第一周/最后一周。 YEARWEEK 可让您将后退/前进的周数保留在一个变量中,并且不会包含前/未来年份的相同周数,并且比此处的大多数其他答案要短得多。

【讨论】:

  • 据我所知,这是唯一真正正确回答 OP 问题的答案。问题是如何获取前一周的记录。这里的许多答案实际上是不正确的。
  • 如果您还想指定一周的开始日期,请向 YEARWEEK() 提供第二个参数:WHERE YEARWEEK(dateColumnFromTbl, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)
  • 如果我也想包括今天的日期......在上周......那是怎么回事?
【解决方案4】:

简化形式:

上周数据:

SELECT id FROM tbl


WHERE 
WEEK (date) = WEEK( current_date ) - 1 AND YEAR( date) = YEAR( current_date );

2 周前数据:

SELECT id FROM tbl


WHERE 
WEEK (date) = WEEK( current_date ) - 2 AND YEAR( date) = YEAR( current_date );

SQL 小提琴

http://sqlfiddle.com/#!8/6fa6e/2

【讨论】:

  • 一年中的第一周会发生什么?
  • 问题是选择上周的数据?如果是一年中的第一周,并且要选择上周的数据,则查询将返回上一年的最后一周。
  • 我只是被 YEAR(date) = YEAR(current_date) 弄糊涂了。那怎么能选择上一年呢?
【解决方案5】:

您可以在 php 中进行计算,然后将其添加到您的查询中:

$date = date('Y-m-d H:i:s',time()-(7*86400)); // 7 days ago

$sql = "SELECT * FROM table WHERE date <='$date' ";

现在这将给出一周前的日期

【讨论】:

    【解决方案6】:

    请人们...“上周”就像 OP 所问的那样,我正在寻找的地方(但没有一个令人满意的答案)是最后一周。

    如果今天是星期二,那么 LAST WEEK 是星期一 一周前 到星期日 一周前

    所以:

    WHERE
        WEEK(yourdate) = WEEK(NOW()) - 1
    

    或 ISO 周:

    WHERE
        WEEK(yourdate, 3) = WEEK(NOW(), 3) - 1
    

    【讨论】:

    • 如果您有超过 1 年的数据,请注意这一点,因为它也会显示前几年的同一周。
    • 绝对正确,但这几乎适用于所有答案。它确实需要GROUP BY 或类似的东西。
    【解决方案7】:

    可能最简单的方法是:

    SELECT id
    FROM table
    WHERE date >= current_date - 7
    

    8 天(即周一至周一)

    【讨论】:

      【解决方案8】:

      这是一种在 MySQL 中获取上周、月份和年份记录的方法。

      上周

      SELECT UserName, InsertTime 
      FROM tblaccounts
      WHERE WEEK(InsertTime) = WEEK(NOW()) - 1;
      

      上个月

      SELECT UserName, InsertTime 
      FROM tblaccounts
      WHERE MONTH(InsertTime) = MONTH(NOW()) - 1;
      

      去年

      SELECT UserName, InsertTime 
      FROM tblaccounts
      WHERE YEAR(InsertTime) = YEAR(NOW()) - 1;
      

      【讨论】:

      • 我们可以在一个查询中使用所有三个吗?在子查询中?
      【解决方案9】:

      您需要在中间件(php、python 等)中计算相对于今天的哪一天是星期日*

      那么,

      select id
      from table
      where date >= "$sunday-date" + interval 7 DAY
      
      • 也可能是一种在 MySQL 中获取相对于今天的星期天日期的方法;如果执行起来不太昂贵,那可以说是更清洁的解决方案

      【讨论】:

        【解决方案10】:

        可以是一行:

        SELECT * FROM table WHERE Date BETWEEN (NOW() - INTERVAL 7 DAY) AND NOW()
        

        【讨论】:

          【解决方案11】:

          一个简单的方法可以是这个,这是我的代码中的一个真实示例,并且效果很好:

          where("actions.created_at >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK)")
          

          【讨论】:

            【解决方案12】:

            如果您要检索过去 7 天内的记录,可以使用下面的 sn-p:

            SELECT date FROM table_name WHERE DATE(date) >= CURDATE() - INTERVAL 7 DAY;
            

            【讨论】:

              【解决方案13】:

              上述查询将不起作用。 在where 子句之后,如果我们不能CAST 列值,那么它将不起作用。您应该cast 列值。

              例如:

              SELECT.....
              WHERE CAST( yourDateColumn AS DATE ) > DATEADD( DAY, -7, CAST( GETDATE() AS DATE )
              

              【讨论】:

                【解决方案14】:

                For more example Like last month, last year, last 15 days, last 3 months

                获取上周记录

                使用下面的 MySQL 查询从 mysql 数据库表中获取上周的记录。

                SELECT name, created_at 
                FROM employees
                WHERE
                YEARWEEK(`created_at`, 1) = YEARWEEK( CURDATE() - INTERVAL 1 WEEK, 1)
                

                【讨论】:

                  【解决方案15】:
                  SELECT id  FROM tb1
                  WHERE 
                  YEARWEEK (date) = YEARWEEK( current_date -interval 1 week ) 
                  

                  【讨论】:

                  • 请解释为什么您的代码回答了提问者的问题。
                  【解决方案16】:

                  我也经常做一个快速的“上周”检查,以下对我来说效果很好,包括今天。

                  DECLARE @StartDate DATETIME 
                  DECLARE @EndDate DATETIME 
                  
                  SET @StartDate = Getdate() - 7 /* Seven Days Earlier */
                  SET @EndDate = Getdate() /* Now */
                  
                  SELECT id 
                  FROM   mytable 
                  WHERE  date BETWEEN @StartDate AND @Enddate 
                  

                  如果您希望今天不包括在内,只需从@EndDate 中减去额外的一天。如果我今天选择这两个变量得到 ​​p>

                  @StartDate 2015-11-16 16:34:05.347 /* 上周一 */

                  @EndDate 2015-11-23 16:34:05.347 /* 这个星期一 */

                  如果我想要星期天到星期天,我会得到以下内容。

                  SET @StartDate = Getdate() - 8 /* Eight Days Earlier */
                  SET @EndDate = Getdate() - 1  /* Yesterday */
                  

                  @StartDate 2015-11-15 16:34:05.347 /* 上周日 */

                  @EndDate 2015-11-22 16:34:05.347 /* 上周日 */

                  【讨论】:

                    【解决方案17】:
                    WHERE yourDateColumn > DATEADD(DAY, -7, GETDATE()) ;
                    

                    【讨论】:

                      【解决方案18】:

                      你也可以用这种方式

                      SELECT *
                      FROM   inventory
                      WHERE  YEARWEEK(`modify`, 1) = YEARWEEK(CURDATE(), 1)
                      

                      【讨论】:

                        【解决方案19】:

                        我在从星期日开始的那一周使用这个:

                        SELECT id FROM tbl
                        WHERE
                        date >= curdate() - INTERVAL DAYOFWEEK(curdate())+5 DAY  
                        AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-2 DAY
                        

                        【讨论】:

                          【解决方案20】:

                          试试这个:

                          Declare @Daytype varchar(15),
                                  @StartDate datetime,
                                  @EndDate datetime
                          set @Daytype = datename(dw, getdate())
                          
                          if @Daytype= 'Monday' 
                              begin
                                  set @StartDate = getdate()-7 
                                  set @EndDate = getdate()-1
                          
                              end
                          
                          
                          else if @Daytype = 'Tuesday'
                          
                              begin
                                  set @StartDate = getdate()-8 
                                  set @EndDate = getdate()-2
                          
                              end
                          Else if @Daytype = 'Wednesday'
                              begin
                                  set @StartDate = getdate()-9
                                  set @EndDate = getdate()-3
                              end
                          Else if @Daytype = 'Thursday'
                              begin
                                  set @StartDate = getdate()-10 
                                  set @EndDate = getdate()-4
                              end
                          
                          Else if @Daytype = 'Friday'
                          
                              begin
                                  set @StartDate = getdate()-11
                                  set @EndDate = getdate()-5
                          
                              end
                          
                          Else if @Daytype = 'Saturday'
                          
                              begin
                                  set @StartDate = getdate()-12
                                  set @EndDate = getdate()-6
                          
                              end
                          
                          Else if @Daytype = 'Sunday'
                          
                              begin
                                  set @StartDate = getdate()-13
                                  set @EndDate = getdate()-7
                          
                              end
                          
                           select @StartDate,@EndDate
                          

                          【讨论】:

                            【解决方案21】:

                            你可以试试这个。它对我有用:

                            where date(createdtime) <= date(curdate())-7
                            

                            在上面的代码中createdtime是数据库字段名称,这个名称可能因人而异。

                            【讨论】:

                            • 从任何 mysql 编辑器共享代码 sn-p。这种方式没有格式化和代码高亮就不清楚了。
                            • 它选择以前的日期,因此与要求的完全相反。与简单的 curdate() 相比,date(curdate()) 也没有任何意义。
                            【解决方案22】:

                            如果您已经知道日期,那么您可以简单地在它们之间使用,如下所示:

                            SELECT id    
                            FROM `Mytable`    
                            where MyDate BETWEEN "2011-05-15" AND "2011-05-21"
                            

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2015-09-08
                              • 1970-01-01
                              • 1970-01-01
                              • 2018-10-31
                              • 1970-01-01
                              相关资源
                              最近更新 更多