日付に接続されたデータを持つ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だけでこれらの日付を追加できますか?
「カレンダーテーブル」と呼ばれることが多い概念を使用できます。 ここ は、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
を作成することもできます。
Select * from emp where joindate between date1 and date2;
しかし、このクエリは適切なデータを表示しません。
例えば
1-jan-2013 to 12-jan-2013.
しかし、それはショーデータです
1-jan-2013 to 11-jan-2013.
この状況は非常に簡単に処理できます
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( )**
ハッピーコーディング:)
すべての日付を含む表はありますか?そうでない場合は、カレンダーテーブルの実装を検討し、データをカレンダーテーブルに結合したままにしておくことをお勧めします。
あなたがそれを避けることができるなら..それをしないでください
データベースは実際にはこのために設計されたものではなく、クエリ内で(日付のリストにかかわらず)データを効率的に作成しようとしています。
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
}
これの利点は、データ伝送の削減です。クエリのデバッグがより簡単で簡単になりました。カレンダーテーブルがあふれる心配はありません。
DATE_ADD('$end_date', INTERVAL 1 DAY)
を使用して、終了日に1日を追加する必要があります