MySQL查询以选择上周的数据?


96

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

表值:

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 Query相同。


因此,为了澄清一下,您是否需要自星期日起的数据,不一定是7天的数据?因此,如果今天是星期一,您将获得2天的数据(星期日和星期一)?
布伦丹·朗

周日至周六。不是最近7天
coderex 2011年

我现在不希望实际将其转换为SQL,但是您可以在Wikipedia上找到一种确定星期几的算法,然后使用该算法来确定回溯的时间:en.wikipedia.org/wiki/ …
布伦丹·朗

@Brendan Long:他可以使用SELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1数周,但我想他的目标不是真正的日历周。至少他没有提到像ISO-8601这样的编号,也没有提及是否要考虑年度变化。
尔根·塞伦(JürgenThelen)

对我来说,答案是WHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY
Connor Leech,

Answers:


123
SELECT id FROM tbl
WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY

1
嗨,如何在上周开始,每周的定义是从星期一到星期日
Xman Classical

5
@Graph是的,上面的SQL脚本将是这样:从tbl WHERE DATE> DATE_SUB(DATE(NOW()),INTERVAL DAYOFWEEK(NOW())+ 6 DAY)和DATE <= DATE_SUB(DATE(NOW( )),间隔DAYOFWEEK(NOW())-1 DAY)
Xman Classical

7
它返回的是过去7天而不是上周
kazuar,2016年


21
SELECT id FROM table1
WHERE YEARWEEK(date) = YEARWEEK(NOW() - INTERVAL 1 WEEK)

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


2
据我所知,这是实际上可以正确回答OP问题的唯一答案。问题是如何获取前一周的记录。实际上,这里的许多答案都是错误的。
squarewav

如果您还想指定一周的开始日期,请向YEARWEEK()提供第二个参数: WHERE YEARWEEK(dateColumnFromTbl, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)
stamster

13

简化形式:

上周数据:

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


一年的第一周会怎样?
Christian Goetze 2013年

1
问题是要选择上周的数据?如果是一年中的第一周,并且您要选择上周的数据,则查询将返回上一年的最后一周。
Anam

4
那我只是对YEAR(date)= YEAR(current_date)感到困惑。那如何选择上一年?
Christian Goetze 2013年

8

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

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

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

现在,它将给出一周前的日期


5

最简单的方法可能是:

SELECT id
FROM table
WHERE date >= current_date - 7

8天(即星期一至星期一)


3

请人们...“上周”就像操作员问的那样,我正在寻找的位置(但没有找到满意的答案)是“最后一周”。

如果今天是星期二,那么最后一个星期是星期一一个星期前到星期日一个星期前

所以:

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

或ISO周:

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

2

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

然后,

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

2

它可以在一行中:

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


1

上面的查询将不起作用。在where子句之后,如果我们不能CAST使用列值,那么它将无法正常工作。您应该cast使用列值。

例如:

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

0
SELECT id  FROM tb1
WHERE 
YEARWEEK (date) = YEARWEEK( current_date -interval 1 week ) 

1
请解释为什么您的代码可以回答提问者的问题。
乔什·伯吉斯

0

我也经常进行快速的“上周”检查,以下内容对我来说很有效,包括今天。

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中减去额外的一天。如果我今天选择这两个变量,

@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 / *上周日* /



0

您也可以使用它说

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

0

我从星期日开始的一周使用此方法:

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


0

这是一种获取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;


-1

试试这个:

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

-5

如果您已经知道日期,则可以在之间使用,例如:

SELECT id    
FROM `Mytable`    
where MyDate BETWEEN "2011-05-15" AND "2011-05-21"
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.