2つの日付間の日付範囲からデータを選択します


100

名前付きのテーブルがあり、Product_Salesこのようなデータを保持しています

Product_ID | Sold_by | Qty | From_date  | To_date
-----------+---------+-----+------------+-----------
3          | 12      | 7   | 2013-01-05 | 2013-01-07
6          | 22      | 14  | 2013-01-06 | 2013-01-10
8          | 11      | 9   | 2013-02-05 | 2013-02-11

次に、日付範囲から2つの日付の間の売上データを選択する場合のクエリは何ですか?

たとえば、から2013-01-03までの販売データを選択するとします2013-01-09


To_date> 2013-01-03 AND From_date <2013-01-09。?
jpulikkottil

回答:


145

区間交差の説明

ご覧のとおり、作業を完了するには2つの方法があります。

  • 受け入れ可能なすべてのオプションを登録する
  • 間違ったオプションをすべて除外する

明らかに、2番目の方法の方がはるかに単純です(4に対して2ケースのみ)。

SQLは次のようになります。

SELECT * FROM Product_sales 
WHERE NOT (From_date > @RangeTill OR To_date < @RangeFrom)

13
私はあなたが答えを説明するためにこれをホワイトボードに描いたのが大好きだと言いたいだけです。あなたは私の尊敬と賞賛を持っています。
Ben Bynum

2
私は、この問題はかなり古いであることを知っていますが、したくないか、この使用できない場合WHERE NOTの条件を、オペレータを周りに回すと同等を追加することも仕事をしている: SELECT * FROM Product_sales WHERE From_date <= @RangeTill OR To_date >= @RangeFrom
ローレンツグルック

84
SELECT * from Product_sales where
(From_date BETWEEN '2013-01-03'AND '2013-01-09') OR 
(To_date BETWEEN '2013-01-03' AND '2013-01-09') OR 
(From_date <= '2013-01-03' AND To_date >= '2013-01-09')

すべての可能性をカバーする必要があります。From_DateまたはTo_Dateが日付範囲の間にあるか、レコードの日付が範囲全体をカバーしている可能性があります。

いずれかがFrom_dateまたはTo_date日付の間にある、またはFrom_date開始日よりも小さいとTo_date終了日よりも大きいです。次に、この行が返されます。


ページの回答(Y)
GreenROBO

入力した日付が両方ともnullまたは空の場合、すべてのデータを返す方法は?また、日付のいずれかがnullまたは空の場合、その基準に基づいて結果を取得する必要があります
コーディングワールド

40

次のクエリを試して、範囲内の日付を取得してください。

SELECT  *
FROM    Product_sales 
WHERE   From_date >= '2013-01-03' AND
        To_date   <= '2013-01-09'

8
これはすべての可能性をカバーしているわけではありません!
FallenAngel

@FallenAngel、カバーされていないものを教えてください。
バブロ2016年

4
私の回答を確認してください。以前に開始さstart_datestart_date、との間に終了した販売は対象外でしたend_date。一方、質問は十分に明確ではないようですが、特定の日付の間、または日付範囲を部分的に含む日付の間だけである販売を行うべきかどうかはわかりませんが、どちらか一方または両方に及ぶ可能性がありますか?ですから、基本的な問題は、疑問が明確でないことだと思います。
FallenAngel、2016年

私はこの投稿が古いことを知っていますが、それらを読んでいる人のために:これは日付の間ではなく日付を含みます。からとへ。
Ken

23
SELECT * FROM Product_sales 
WHERE From_date between '2013-01-03'
AND '2013-01-09'

From_date:2012-12-30からTo_Date:2013-01-05の例では、選択が間違っています。これらの日付は目的の範囲内にありますが、SQL内では日付が範囲のに始まるため返されませんが、範囲で終了します。
NetVicious 2017

5

これは、探しているすべての条件をカバーします。

SELECT * from Product_sales where (From_date <= '2013-01-09' AND To_date >= '2013-01-01')

4
SELECT *
FROM Product_sales
WHERE (
From_date >= '2013-08-19'
AND To_date <= '2013-08-23'
)
OR (
To_date >= '2013-08-19'
AND From_date <= '2013-08-23'
)

1
包含的交差の場合、from_dateが開始前で、to_dateが終了後の場合にキャッチするOR句をもう1つ追加する必要があります。OR(To_date <= '2013-08-19' AND From_date> = '2013-08- 23分)
jhorback 14

3

してみてください:

DECLARE @FrmDt DATETIME, @ToDt DATETIME
SELECT @FrmDt='2013-01-03', @ToDt='2013-01-09'

SELECT * 
FROM Product_sales 
WHERE (@FrmDt BETWEEN From_date AND To_date) OR 
    (@ToDt BETWEEN From_date AND To_date)

3

私の2セントだけですが、 "dd-MMM-yyyy"形式を使用するのが最も安全です。dbサーバーは、サーバーの地域設定に関係なく、必要なものを知っているからです。そうしないと、日付の地域設定がyyyy-dd-mmであるサーバーで問題が発生する可能性があります(理由は問われません)。

したがって:

SELECT * FROM Product_sales 
WHERE From_date >= '03-Jan-2013'
AND To_date <= '09-Jan-2013'

それはいつも私にとってうまくいきます;-)


3

これはSQL_Server_2008 R2で動作します

Select * 
from Product_sales
where From_date 
between '2013-01-03' and '2013-01-09'

3
select * 
from table 
where
( (table.EndDate > '2013-01-05') and (table.StartDate < '2013-01-07' )  )

2

このクエリは、次のことに役立ちます。

select * 
from XXXX
where datepart(YYYY,create_date)>=2013 
and DATEPART(YYYY,create_date)<=2014

1
SELECT NULL  
    FROM   HRMTable hm(NOLOCK)  
    WHERE  hm.EmployeeID = 123
        AND (  
                (  
                    CAST(@Fromdate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                )  
                OR (  
                    CAST(@Todate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                   )  
                ) 
         )

1

このクエリを確認します。このクエリを作成して、チェックイン日が予約日と重複しているかどうかを確認します

SELECT * FROM tbl_ReservedRooms
WHERE NOT ('@checkindate' NOT BETWEEN fromdate AND todate
  AND '@checkoutdate'  NOT BETWEEN fromdate AND todate)

これにより、重複している詳細が再実行され、重複していない詳細が取得され、クエリから「NOT」が削除されます


1

次のフラグメントを使用してみることもできます。

select  * from  Product_sales 
where  From_date  >= '2013-01-03' and game_date  <= '2013-01-09'

1

これは簡単です。このクエリを使用して、2つの日付間の日付範囲から選択したデータを検索します

select * from tabblename WHERE (datecolumn BETWEEN '2018-04-01' AND '2018-04-5')

0

数値を比較するのと同じように、SQLで日付を比較する必要があります。

SELECT * FROM Product_sales
WHERE From_date >= '2013-01-01' AND To_date <= '2013-01-20'

0

これは、8月に実行されていたすべての製品売上を検索するクエリです。

  • 8月中にアクティブであったProduct_salesを見つけます
  • 8月末までに開始したものをすべて含める
  • 8月1日より前に終了したものはすべて除外します

クエリを検証するためのケースステートメントも追加します

SELECT start_date, 
       end_date, 
       CASE 
         WHEN start_date <= '2015-08-31' THEN 'true' 
         ELSE 'false' 
       END AS started_before_end_of_month, 
       CASE 
         WHEN NOT end_date <= '2015-08-01' THEN 'true' 
         ELSE 'false' 
       END AS did_not_end_before_begining_of_month 
FROM   product_sales 
WHERE  start_date <= '2015-08-31' 
       AND end_date >= '2015-08-01' 
ORDER  BY start_date; 

0
DECLARE @monthfrom int=null,
@yearfrom int=null,
@monthto int=null,
@yearto int=null,
@firstdate DATE=null,
@lastdate DATE=null

SELECT @firstdate=DATEADD(month,@monthfrom-1,DATEADD(year,@yearfrom-1900,0)) /*Setting First Date using From Month & Year*/
SELECT @lastdate= DATEADD(day,-1,DATEADD(month,@monthto,DATEADD(year,@yearto-1900,0)))/*Setting Last Date using From Month & Year*/

SELECT *  FROM tbl_Record
WHERE  (DATEADD(yy, Year - 1900, DATEADD(m, Month - 1, 1 - 1)) BETWEEN CONVERT(DATETIME, @firstdate, 102) AND 
CONVERT(DATETIME, @lastdate, 102))

-1

これは簡単です。このクエリを使用して、必要なものを見つけます。

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.