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クエリは同じです。


明確にするために、日曜日以降のデータが必要であり、必ずしも7日間のデータが必要なわけではありませんか?今日が月曜日の場合、2日間のデータ(日曜日と月曜日)を取得しますか?
ブレンダンロング、

日曜日から土曜日。過去7日間ではない
coderex

現在、これを実際にSQLに変換する気はありませんが、ウィキペディアで曜日を判別するアルゴリズムを見つけ、それを使用して、さかのぼってどこまでさかのぼるかを決定できます。en.wikipedia.org
ブレンダンロング

@ブレンダン・ロング:彼はSELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1何週間も使用できますが、彼の目標は実際の暦週ではないと思います。少なくとも彼は、ISO-8601のようなs / tについては言及していませんでした。
ユルゲン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 Classical

5
@Graphはい、上記のSQLスクリプトは次のようになります。 ))、INTERVAL DAYOFWEEK(NOW())-1 DAY)
Xmanクラシック

7
先週ではなく過去7日間を返す
kazuar 2016年


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

私はYEARWEEK関数を使用して、前の暦週全体に戻ります(今日の7日前ではありません)。YEARWEEKは、週の開始を設定する、または年の最初/最後の週の処理方法を決定する2番目の引数も許可します。YEARWEEKを使用すると、戻る/進む週数を単一の変数に保持できます。前/未来の年と同じ週数は含まれず、ここにある他のほとんどの回答よりもはるかに短くなります。


2
私の知る限りでは、これが実際にOPの質問に正しく答える唯一の答えです。問題は、前週の記録をどのように取得するかでした。ここでの答えの多くは実際には正しくありません。
squarewav 2018年

あなたにも週の開始日を指定したい場合は、(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

1
問題は、先週のデータを選択することでしたか?年の最初の週で、先週のデータを選択する場合、クエリは前年の最後の週を返します。
Anam

4
私は、YEAR(date)= YEAR(current_date)で混乱しています。どうすれば前年を選択できますか?
Christian Goetze

8

あなたはphpで計算を行い、それをクエリに追加することができます:

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

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

これで1週間前の日付が表示されます


5

おそらく最も簡単な方法は次のとおりです。

SELECT id
FROM table
WHERE date >= current_date - 7

8日間(月曜日-月曜日)


3

人をお願いします... OPが尋ねたような「先週」と私が探していた場所(しかし、満足のいく答えのどれも見つかりませんでした)は最後の週です。

今日が火曜日の場合、最後の週は月曜日のA WEEK AGOから日曜日のA WEEK AGOです。

そう:

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
コードが質問者の質問に答える理由を説明してください。
Josh Burgess、2014

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から1日を差し引いてください。今日これら2つの変数を選択すると、

@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

iこれをSUNDAYからの週の開始に使用します。

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;

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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.