İki tarih arasındaki tarih aralığından verileri seçin


100

Adlandırılmış bir tablom var Product_Salesve bunun gibi verileri tutuyor

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

Şimdi, bir tarih aralığındaki iki tarih arasındaki satış verilerini seçmek istersem sorgu nedir?

Örneğin, satış verilerini seçmek istediğiniz 2013-01-03için 2013-01-09.


To_date> 2013-01-03 VE From_date <2013-01-09. ?
jpulikkottil

Yanıtlar:


145

aralıklı kesişme açıklaması

Gördüğünüz gibi, işleri halletmenin iki yolu vardır:

  • tüm kabul edilebilir seçenekleri listeleme
  • tüm yanlış seçenekleri hariç tut

Açıkçası, ikinci yol çok daha basittir (dörde karşı sadece iki durum).

SQL'iniz şöyle görünecektir:

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

13
Sadece cevabı açıklamak için bunu bir beyaz tahtaya çizmeni sevdiğimi söylemek istiyorum. Benim saygım ve hayranlığım var.
Ben Bynum

3
Bu sorunun oldukça eski olduğunu biliyorum, ancak bu WHERE NOTkoşulu istemiyorsanız veya kullanamıyorsanız , operatörlerin etrafında dönüp bir eşitlik eklemek de işi yapmaktır : SELECT * FROM Product_sales WHERE From_date <= @RangeTill OR To_date >= @RangeFrom
Laurenz Glück

85
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')

Tüm olasılıkları kapsamalısın. From_Date veya To_Date , tarih aralığınız arasında olabilir veya kayıt tarihleri ​​tüm aralığı kapsayabilir.

Tarihlerden biri From_dateveya To_datetarihler arasındaysa veya From_datebaşlangıç ​​tarihinden To_dateküçükse ve bitiş tarihinden büyükse; sonra bu satır döndürülmelidir.



Her iki giriş tarihi de boş veya boşsa tüm veriler nasıl döndürülür? ve ayrıca, tarihlerden biri geçersiz veya boşsa, bu kriterlere göre sonuç almalısınız
Kodlama dünyası

40

Aralıklar arasındaki tarihleri ​​almak için aşağıdaki sorguyu deneyin:

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

8
Bu tüm olasılıkları kapsamaz!
FallenAngel

@FallenAngel, hangilerinin kapsam dışı olduğunu bana açıklar mısınız?
Babblo

4
Benim edin cevabı , daha önce başladığını satışları kapağı yoktu lütfen start_dateama aralarında sona erdi start_dateve end_date. Öte yandan, soru yeterince açık değil sanırım, kesin olarak verilen tarihler arasında veya tarih aralığını kısmen içeren, ancak bir tarafa veya diğerine veya her ikisine de uzanabilecek satışlar yapıp yapmamamız gerektiğine dair hiçbir fikrimiz yok. Yani temel sorun, sanırım sorunun net olmamasıyla ilgili.
FallenAngel

Bu yazının eski olduğunu biliyorum ama okuyanlar için: Bu tarihler arasında değil, tarihler dahil. Başlangıç ​​ve Bitiş.
Ken

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

Seçiminiz, From_date: 2012-12-30 ila To_Date: 2013-01-05 örneği için yanlış olacaktır. Bu tarihler istenen aralık içindedir , ancak aralıktan önce başladıkları , ancak aralık içinde bittiği için SQL'inizde döndürülmez .
NetVicious

5
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
Kapsayıcı kesişim için, from_date başlangıçtan önce ve to_date bitişten sonra olduğunda yakalanacak bir OR cümlesi daha eklemek isteyeceksiniz: OR (To_date <= '2013-08-19' AND From_date> = '2013-08- 23 ')
jhorback

5

Bu, aradığınız tüm koşulları kapsar.

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

4

Deneyin lütfen:

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

Sadece 2 sentim, db sunucusu sunucudaki bölgesel ayarlardan bağımsız olarak ne istediğinizi bileceği için "gg-MMM-yyyy" biçimini kullanmayı en güvenli buluyorum. Aksi takdirde, tarih bölgesel ayarları yyyy-gg-aa (herhangi bir nedenle) olan bir sunucuda sorunlarla karşılaşabilirsiniz.

Böylece:

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

Benim için her zaman iyi çalıştı ;-)


3

Bu, SQL_Server_2008 R2 üzerinde çalışıyor

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

Bu sorguyu kontrol edin, bu sorguyu check-in tarihinin herhangi bir rezervasyon tarihiyle tur üzerinden geçip geçmediğini kontrol etmek için oluşturdum

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

bu, çakışmayan ayrıntıları almak için çakışan ayrıntıları yeniden düzenler ve ardından sorgudan "DEĞİL" i kaldırır.


2

Bu sorgu size yardımcı olacaktır:

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

Ayrıca aşağıdaki parçaları kullanmayı da deneyebilirsiniz:

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

1

Bu kolaydır, iki tarih arasındaki tarih aralığından seçili verileri bulmak için bu sorguyu kullanın

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

0

Sayı değerlerini karşılaştırdığınız gibi tarihleri ​​sql'de karşılaştırmalısınız,

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

0

Ağustos ayında gerçekleşen tüm ürün satışlarını bulmak için bir sorgu aşağıda verilmiştir.

  • Ağustos ayı boyunca etkin olan Ürün_satışlarını bulun
  • Ağustos sonundan önce başlayan her şeyi dahil edin
  • 1 Ağustos'tan önce biten her şeyi hariç tutun

Ayrıca sorguyu doğrulamak için bir durum ifadesi ekler

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

bu kolaydır, istediğinizi bulmak için bu sorguyu kullanın.

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.