Запит 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

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

Як писати та запити SQL для того самого.


Отже, щоб уточнити, ви хочете отримати дані з неділі, не обов’язково дані за 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, або про те, чи хоче він враховувати перехід року.
Юрген Телен

Для мене відповідь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 Classical

5
@Graph Так, наведений вище сценарій SQL буде таким: ВИБЕРІТЬ ідентифікатор з tbl WHERE DATE> DATE_SUB (DATE (NOW ()), INTERVAL DAYOFWEEK (NOW ()) + 6 DAY) AND DATE <= DATE_SUB (DATE (NOW ( )), INTERVAL DAYOFWEEK (ЗАРАЗ ()) - 1 ДЕНЬ)
Xman Classical

7
він повертається останні 7 днів замість минулого тижня
kazuar

134
select id from tbname
where date between date_sub(now(),INTERVAL 1 WEEK) and now();

1
Це не вирішує питання ОП, якщо ви запустили це на «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 дозволяє зберегти кількість тижнів, щоб повернутися назад / вперед за однією змінною, і не буде включати ту саму кількість тижнів за попередні / майбутні роки, і це набагато коротше, ніж більшість інших відповідей тут.


2
Наскільки я можу зрозуміти, це єдина відповідь, яка насправді відповідає на питання ОП правильно. Питання полягало в тому, як отримати записи за попередній тиждень . Багато відповідей тут насправді є неправильними.
squarewav

Якщо ви також хочете вказати день початку тижня, надайте 2-й аргумент РІКУ (): 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


Що відбувається в перший тиждень року?
Крістіан Гьотце

1
Питання полягало у відборі даних минулого тижня? Якщо перший тиждень року і ви хочете вибрати дані минулого тижня, запит повернеться минулого тижня попереднього року.
Anam

4
Тоді мене просто бентежить YEAR (дата) = YEAR (поточна_дата). Як можна обрати попередній рік?
Крістіан Гьотце

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; це може бути чистішим рішенням, якби не надто дороге у виконанні



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 16.11.2015 16: 34: 05.347 / * Останній понеділок * /

@EndDate 23.11.2015 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 22.11.2015 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

Наприклад, як минулий місяць, минулий рік, останні 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.