MySQL Query для выбора данных за прошлую неделю?

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

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

Как писать и SQL Query для этого же.

Coderex
источник
Чтобы уточнить, вам нужны данные с воскресенья, а не обязательно данные за 7 дней? Итак, если сегодня понедельник, вы получите данные за 2 дня (воскресенье и понедельник)?
Брендан Лонг
С воскресенья по субботу. Не последние 7 дней
coderex
Мне не хочется сейчас преобразовывать это в SQL, но вы можете найти алгоритм для определения дня недели в Википедии, а затем использовать его, чтобы решить, как далеко назад смотреть: en.wikipedia.org/wiki/ …
Брендан Лонг
@Brendan Long: он мог бы использовать SELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1неделями, но я думаю, его цель - не настоящие календарные недели. По крайней мере, он не упомянул о таких вещах, как ISO-8601, или о том, хочет ли он принять во внимание начало года.
Jürgen Thelen
Для меня ответWHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY
Коннор Лич

Ответы:

123
SELECT id FROM tbl
WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY
пиотрм
источник
1
Привет, Как получить на прошлой неделе с неделей определенным началом с понедельника по воскресенье
Классический Xman
5
@Graph Да, приведенный выше сценарий SQL будет выглядеть так: SELECT id FROM tbl WHERE DATE> DATE_SUB (DATE (NOW ()), INTERVAL DAYOFWEEK (NOW ()) + 6 DAY) AND DATE <= DATE_SUB (DATE (NOW ( )), ИНТЕРВАЛЬНЫЙ ДЕНЬ НЕДЕЛИ (СЕЙЧАС ()) - 1 ДЕНЬ)
Xman Classical
7
он возвращает последние 7 дней вместо прошлой недели
kazuar
134
select id from tbname
where date between date_sub(now(),INTERVAL 1 WEEK) and now();
Вишванатх Далви
источник
1
Это не решает вопрос OP, если вы запустите это «2011-05-22», вы получите id 15...
Сезар
2
Это лучший ответ.
Jad Chahine
21
SELECT id FROM table1
WHERE YEARWEEK(date) = YEARWEEK(NOW() - INTERVAL 1 WEEK)

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

timecrust
источник
2
Насколько я могу судить, это единственный ответ, который на самом деле правильно отвечает на вопрос ОП. Вопрос был в том, как получить записи с предыдущей недели . Многие ответы здесь на самом деле неверны.
squarewav
Если вы также хотите указать день начала недели, укажите 2-й аргумент для 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 Fiddle

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

Анам
источник
Что происходит в первую неделю года?
Christian Goetze
1
Вопрос был в выборе данных за прошлую неделю? Если первая неделя года, и вы хотите выбрать данные за последнюю неделю, запрос вернет последнюю неделю предыдущего года.
Anam
4
Меня просто смущает ГОД (дата) = ГОД (текущая_дата) тогда. Как это выбрать предыдущий год?
Кристиан Гетце
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
MS Berends
источник
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()
Абхинав Бхардвадж
источник
2

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

where("actions.created_at >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK)")
Хавьер Родригес Ортис
источник
1

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

например:

SELECT.....
WHERE CAST( yourDateColumn AS DATE ) > DATEADD( DAY, -7, CAST( GETDATE() AS DATE )
user7821340
источник
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
WHERE yourDateColumn > DATEADD(DAY, -7, GETDATE()) ;
Вира Индуваси
источник
0

Вы также можете использовать это обычным способом

SELECT *
FROM   inventory
WHERE  YEARWEEK(`modify`, 1) = YEARWEEK(CURDATE(), 1)
HAROONMIND
источник
0

Я использую это для недели, начинающейся с ВОСКРЕСЕНИЯ:

SELECT id FROM tbl
WHERE
date >= curdate() - INTERVAL DAYOFWEEK(curdate())+5 DAY  
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-2 DAY
Хоанг Ву Тгтт
источник
0

Например, как в прошлом месяце, прошлом году, последних 15 дней, последних 3 месяцах.

Получить последнюю запись за неделю

Использование приведенного ниже запроса MySQL для извлечения записей за последнюю неделю из таблицы базы данных mysql.

SELECT name, created_at 
FROM employees
WHERE
YEARWEEK(`created_at`, 1) = YEARWEEK( CURDATE() - INTERVAL 1 WEEK, 1)
Разработчик
источник
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;
М. Хамза Раджпут
источник
0

Если вы хотите получить записи за последние 7 дней, вы можете использовать приведенный ниже фрагмент:

SELECT date FROM table_name WHERE DATE(date) >= CURDATE() - INTERVAL 7 DAY;
Симо Патрек
источник
-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"
user765060
источник