Pilih data dari rentang tanggal antara dua tanggal

100

Saya memiliki tabel bernama Product_Salesdan menyimpan data seperti ini

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

Sekarang apa pertanyaannya jika saya ingin memilih data penjualan antara dua tanggal dari rentang tanggal?

Misalnya, saya ingin memilih data penjualan dari 2013-01-03sampai 2013-01-09.

Ronjon
sumber
To_date> 2013-01-03 DAN From_date <2013-01-09. ?
jpulikkottil

Jawaban:

144

deskripsi persimpangan interval

Seperti yang Anda lihat, ada dua cara untuk menyelesaikan sesuatu:

  • minta semua opsi yang dapat diterima
  • kecualikan semua opsi yang salah

Jelas, cara kedua jauh lebih sederhana (hanya dua kasus melawan empat).

SQL Anda akan terlihat seperti:

SELECT * FROM Product_sales 
WHERE NOT (From_date > @RangeTill OR To_date < @RangeFrom)
Dmitry Lukichev
sumber
13
Saya hanya ingin mengatakan saya senang Anda menggambar ini di papan tulis untuk menjelaskan jawabannya. Anda memiliki rasa hormat dan kekaguman saya.
Ben Bynum
3
Saya tahu bahwa masalah ini sudah cukup lama tetapi jika Anda tidak ingin atau tidak dapat menggunakan WHERE NOTkondisi ini , membalikkan operator dan menambahkan persamaan juga berhasil: SELECT * FROM Product_sales WHERE From_date <= @RangeTill OR To_date >= @RangeFrom
Laurenz Glück
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')

Anda harus menutupi semua kemungkinan. From_Date atau To_Date bisa jadi antara rentang tanggal Anda atau tanggal pencatatan bisa mencakup seluruh rentang.

Jika salah satu dari From_dateatau di To_dateantara tanggal, atau From_datekurang dari tanggal mulai dan To_datelebih besar dari tanggal akhir; maka baris ini harus dikembalikan.

FallenAngel
sumber
Answer Of the Page (Y)
GreenROBO
Bagaimana cara mengembalikan semua data jika tanggal input nol atau kosong? dan juga, jika salah satu tanggal kosong atau kosong harus mendapatkan hasil berdasarkan kriteria itu
Coding dunia
40

Coba kueri berikut untuk mendapatkan tanggal di antara rentang:

SELECT  *
FROM    Product_sales 
WHERE   From_date >= '2013-01-03' AND
        To_date   <= '2013-01-09'
jkmurphy1
sumber
8
Ini tidak mencakup semua kemungkinan!
FallenAngel
@FallenAngel, dapatkah Anda menjelaskan kepada saya yang tidak tercakup?
Babblo
4
Tolong periksa jawaban saya , Anda tidak menutupi penjualan yang dimulai sebelumnya start_datetetapi berakhir antara start_datedan end_date. Di sisi lain, pertanyaannya tidak cukup jelas. Saya kira, kami tidak memiliki petunjuk apakah kami harus melakukan penjualan yang hanya di antara tanggal tertentu atau tanggal yang sebagian menyertakan rentang tanggal, tetapi dapat diperpanjang di satu sisi atau sisi lain atau keduanya? Jadi masalah dasarnya adalah tentang pertanyaan yang tidak jelas.
FallenAngel
Saya tahu posting ini sudah tua tetapi untuk mereka yang membaca: Ini bukan di antara tanggal tetapi Termasuk tanggal. Dari dan Ke.
Ken
23
SELECT * FROM Product_sales 
WHERE From_date between '2013-01-03'
AND '2013-01-09'
Berkay Turancı
sumber
Pilihan Anda akan salah untuk contoh From_date: 2012-12-30 to To_Date: 2013-01-05. Tanggal-tanggal ini berada dalam rentang yang diinginkan tetapi dalam SQL Anda tidak akan dikembalikan karena dimulai sebelum rentang, tetapi berakhir di dalam rentang.
NetVicious
5

Ini mencakup semua kondisi yang Anda cari.

SELECT * from Product_sales where (From_date <= '2013-01-09' AND To_date >= '2013-01-01')
Avinash
sumber
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'
)
Kiran K
sumber
1
Untuk persimpangan inklusif Anda akan ingin menambahkan satu lagi klausa ATAU untuk menangkap ketika from_date sebelum mulai dan to_date adalah setelah akhir: OR (To_date <= '2013-08-19' AND From_date> = '2013-08- 23 ')
jhorback
3

Silakan coba:

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)
TechDo
sumber
3

Hanya 2 sen saya, saya merasa menggunakan format "dd-MMM-yyyy" paling aman karena server db akan tahu apa yang Anda inginkan terlepas dari pengaturan regional di server. Jika tidak, Anda berpotensi mengalami masalah di server yang memiliki pengaturan regional tanggalnya sebagai tttt-hh-mm (untuk alasan apa pun)

Jadi:

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

Itu selalu bekerja dengan baik untuk saya ;-)

KDT
sumber
3

Ini bekerja pada SQL_Server_2008 R2

Select * 
from Product_sales
where From_date 
between '2013-01-03' and '2013-01-09'
I_Valchev
sumber
3
select * 
from table 
where
( (table.EndDate > '2013-01-05') and (table.StartDate < '2013-01-07' )  )
Gestef
sumber
2

Kueri ini akan membantu Anda:

select * 
from XXXX
where datepart(YYYY,create_date)>=2013 
and DATEPART(YYYY,create_date)<=2014
Ritesh Yadav
sumber
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)  
                   )  
                ) 
         )
zafarsiddiqui
sumber
1

Periksa kueri ini, saya membuat kueri ini untuk memeriksa apakah tanggal check-in melebihi lap dengan tanggal reservasi

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

ini akan mengembalikan detail yang tumpang tindih, untuk mendapatkan detail yang tidak tumpang tindih, lalu hapus 'TIDAK' dari kueri

anandd360.dll
sumber
1

Anda juga dapat mencoba menggunakan fragmen berikut:

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

Ini mudah, gunakan kueri ini untuk menemukan data pilihan dari rentang tanggal antara dua tanggal

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

Anda harus membandingkan tanggal dalam sql seperti Anda membandingkan nilai angka,

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

Berikut adalah kueri untuk menemukan semua penjualan produk yang berjalan selama bulan Agustus

  • Cari Product_sales ada yang aktif selama bulan Agustus
  • Sertakan apa pun yang dimulai sebelum akhir Agustus
  • Kecualikan apa pun yang berakhir sebelum 1 Agustus

Juga menambahkan pernyataan kasus untuk memvalidasi kueri

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; 
jspooner
sumber
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))
Kode
sumber
-1

ini mudah, gunakan kueri ini untuk menemukan apa yang Anda inginkan.

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
Abdirazack
sumber