44

日付に接続されたデータを含む 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 だけのデータとして何らかの方法で追加できますか?

4

7 に答える 7

38

「カレンダー テーブル」と呼ばれることが多い概念を使用できます。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副選択の代わりにテーブルを作成したい場合があります。

于 2009-07-03T17:59:41.980 に答える
12
Select *  from  emp where joindate between date1 and date2;

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

例えば

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

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

1-jan-2013 to 11-jan-2013.
于 2013-09-19T14:46:18.500 に答える
10

この状況を処理するのは非常に簡単です

BETWEEN CLAUSEは、date_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( )**

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

于 2013-10-30T06:32:49.247 に答える
4

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

于 2009-07-03T17:18:10.520 に答える
1

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

データベースは実際にはこのように設計されていません。クエリ内でデータ (日付のリストではありますが) を効果的に作成しようとしています。

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
}

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

于 2016-04-14T14:12:25.270 に答える
1

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

于 2016-12-08T12:17:38.583 に答える