0

MySQLテーブルをクエリして、特定の日付範囲の各日の特定のデータを取得するためのより適切で迅速な方法を見つける必要があります。テーブルには、開始日と終了日を指定する2つの日付列があります。

表の例:プロモーション列:

ID   startDate     EndDate     Discount     CategoryID  
=============================================================
1    2010/08/01    2010/08/10     10.00        A
2    2010/08/01    2010/08/10     15.00        B
3    2010/08/11    2010/08/15     05.00        A
4    2010/08/11    2010/08/15     10.00        B

2つの日付範囲が指定されている場合、次のクエリからマッチプロモーションを取得できることを知っています

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND endDate >= "2010/08/15") AND CategoryID = A

上記のクエリの結果は、ID3の行をフェッチします

ただし、上記のクエリの2つの日付範囲が次のように変更された場合

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND endDate >= "2010/08/18") AND CategoryID = A

ロジックがテーブルに格納されているデータのいずれとも一致しないことが理解できるため、一致する結果が得られません。

そのため、終了日がプロモーションの終了日を超えても結果を一致させることができる、より良いソリューションが必要です。ただし、ロジックを変更しても最良の答えは得られません。次のクエリを使用すると結果が得られると思いますが、日付範囲で毎日有効な割引を見つける必要がある場合は、これでも問題全体は解決されません。 。

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND CategoryID = A

私が必要とする本当の結果は、このクエリをループに変換する方法、またはメモリ内の一時的なMySQLテーブルを使用して、以下に示すように毎日の結果をフェッチする方法です。

結果2010/08/12から2010/08/18までの日付範囲で検索する必要があります

===================================================================
Date           Discount    
=========================
2010/08/12      05.00
2010/08/13      05.00
2010/08/14      05.00
2010/08/15      05.00
2010/08/16      null
2010/08/18      null

私の質問と問題が十分に説明されていることを願っています。この問題に関してさらに説明が必要な場合は、お知らせください。

これに対する素晴らしい答えを見たいと思っています。

4

2 に答える 2

1

日付範囲内のアイテムをクエリするには、次を使用します。

SELECT * 
FROM Promotions 
WHERE (startDate >= "2010/08/12" AND endDate <= "2010/08/15") 
AND CategoryID = A

開始日はそれ以降、終了日はそれ以下にする必要があります。

于 2010-08-02T15:37:18.147 に答える
1

次のような日付のカレンダー テーブルが必要です。

Create Table Calendar ( [Date] DateTime Not Null Primary Key )

このテーブルは静的であり、一度だけ入力する必要があります。クエリを実行する任意の日付範囲をカバーする日ごとに 1 つの行が含まれます。これにより、クエリはより簡単になります。

Select C.Date, P.Discount
From Calendar As C
    Left Join Promotions As P
        On C.Date Between P.StartDate And P.EndDate
            And P.Category = 'A'
于 2010-08-02T15:49:39.170 に答える