web-dev-qa-db-ja.com

Mysql:2つの日付の間のすべてのデータを選択します

日付に接続されたデータを持つmysqlテーブルがあります。各行には、次のようなデータと日付があります。

2009-06-25    75
2009-07-01    100
2009-07-02    120

2つの日付の間のすべてのデータを選択するmysqlクエリがあります。これはクエリです:

SELECT data FROM tbl WHERE date BETWEEN date1 AND date2

私の問題は、1日のデータがなくてもdate1とdate2の間の行を取得する必要があることです。

したがって、クエリでは2009-06-25から2009-07-01までの空の日付が欠落します。

何らかの方法で、データとして0だけでこれらの日付を追加できますか?

44
Martymart

「カレンダーテーブル」と呼ばれることが多い概念を使用できます。 ここ は、MySqlでカレンダーテーブルを作成する方法に関する優れたガイドです。

-- create some infrastructure
CREATE TABLE ints (i INTEGER);
INSERT INTO ints VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);

-- only works for 100 days, add more ints joins for more
SELECT cal.date, tbl.data
FROM (
    SELECT '2009-06-25' + INTERVAL a.i * 10 + b.i DAY as date
    FROM ints a JOIN ints b
    ORDER BY a.i * 10 + b.i
) cal LEFT JOIN tbl ON cal.date = tbl.date
WHERE cal.date BETWEEN '2009-06-25' AND '2009-07-01';

副選択の代わりにテーブルcalを作成することもできます。

38
Josef Pfleger
Select *  from  emp where joindate between date1 and date2;

しかし、このクエリは適切なデータを表示しません。

例えば

1-jan-2013 to 12-jan-2013.

しかし、それはショーデータです

1-jan-2013 to 11-jan-2013.
12
gulab

この状況は非常に簡単に処理できます

BETWEEN CLAUSEdate_sub(now()、INTERVAL 30 DAY)AND NOW()と組み合わせて使用​​できます

SELECT
    sc_cust_design.design_id as id,
    sc_cust_design.main_image,
    FROM
    sc_cust_design
WHERE
    sc_cust_design.publish = 1 
    AND **`datein`BETWEEN date_sub( now( ) , INTERVAL 30 DAY ) AND NOW( )**

ハッピーコーディング:)

10
Arshad Munir

すべての日付を含む表はありますか?そうでない場合は、カレンダーテーブルの実装を検討し、データをカレンダーテーブルに結合したままにしておくことをお勧めします。

4
feihtthief

あなたがそれを避けることができるなら..それをしないでください

データベースは実際にはこのために設計されたものではなく、クエリ内で(日付のリストにかかわらず)データを効率的に作成しようとしています。

DBクエリの上にアプリケーション層を持っている人にとって最も簡単な解決策は、そこに空のデータを入力することです。

とにかくクエリ結果をループし、次のようなものを実装できます。

loop_date = start_date

while (loop_date <= end_date){

  if(loop_date in db_data) {
    output db_data for loop_date
  }
  else {
    output default_data for loop_date
  }

  loop_date = loop_date + 1 day
}

これの利点は、データ伝送の削減です。クエリのデバッグがより簡単で簡単になりました。カレンダーテーブルがあふれる心配はありません。

1
Arth

DATE_ADD('$end_date', INTERVAL 1 DAY)を使用して、終了日に1日を追加する必要があります

1
Dedi Koswara