Запрос MySQL для выбора данных с прошлой недели?


Привет у меня есть таблица с полем даты и некоторую другую информацию. Я хочу выбрать все записи с прошлой недели, (неделя начинается с воскресенья).

таблица значений:

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

Я хочу выбрать все идентификаторы с прошлой недели, ожидаемый результат 5, 6, 8. (id 2 не на прошлой неделе, а id 15-на текущей неделе.)

Как написать и SQL-запрос для того же.

18 76

18 ответов:

SELECT id FROM tbl
WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY
select id from tbname
where date between date_sub(now(),INTERVAL 1 WEEK) and now();

упрощенной форме:

данные за прошлую неделю:

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 Fiddle

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

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

Я использую функцию YEARWEEK специально, чтобы вернуться к предыдущей целой календарной неделе (в отличие от 7 дней до сегодняшнего дня). YEARWEEK также позволяет второй аргумент, который установит начало недели или определить, как обрабатываются первая/последняя неделя года. YEARWEEK позволяет сохранить количество недель для перехода назад / вперед в одной переменной и не будет включать в себя тот же номер недели из предыдущих/будущих лет, и это намного короче, чем большинство других ответов здесь.

вы можете сделать свой расчет в php, а затем добавить его в свой запрос:

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

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

теперь это даст дату на неделю назад

вероятно, самый простой способ будет:

SELECT id
FROM table
WHERE date >= current_date - 7

на 8 дней (т. е. понедельник - Понедельник)

вам нужно будет вычислить, какой день относительно сегодняшнего дня является воскресеньем в вашем промежуточном программном обеспечении (php, python и т. д.)*

затем,

select id
from table
where date >= "$sunday-date" + interval 7 DAY
  • может быть способ получить дату воскресенья относительно сегодняшнего дня в MySQL; это, возможно, было бы более чистым решением, если бы не слишком дорого выполнять

это может быть в одной строке:

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

приведенный выше запрос работать не будет. После where предложения, если мы не можем CAST значение столбца, то он не будет работать. Вы должны cast значение столбца.

например:

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

простой способ может быть, это реальный пример из моего кода и прекрасно работает:

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

пожалуйста, люди... "На прошлой неделе", как ОП спросил, И где я искал (но не нашел ни одного из ответов, удовлетворяющих), это последняя неделя.

Если сегодня вторник, то НА ПРОШЛОЙ НЕДЕЛЕ понедельник НЕДЕЛЮ НАЗАД в воскресенье НЕДЕЛЮ НАЗАД.

Так:

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

или в течение нескольких недель ISO:

WHERE
    WEEK(yourdate, 3) = WEEK(NOW(), 3) - 1
SELECT id  FROM tb1
WHERE 
YEARWEEK (date) = YEARWEEK( current_date -interval 1 week ) 

Я часто делаю быструю проверку" на прошлой неделе", и следующее, Как правило, хорошо работает для меня и включает сегодня.

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 /* В Прошлое Воскресенье */

WHERE yourDateColumn > DATEADD(DAY, -7, GETDATE()) ;

вы также можете использовать его esay way

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

Я использую это для недели, начиная с воскресенья:

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

попробуйте это:

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

Если вы уже знаете даты, то вы можете просто использовать между, как это:

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