Запрос 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 ответов:
SELECT id FROM tbl WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY
упрощенной форме:
данные за прошлую неделю:
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
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
Я часто делаю быструю проверку" на прошлой неделе", и следующее, Как правило, хорошо работает для меня и включает сегодня.
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 /* В Прошлое Воскресенье */
вы также можете использовать его 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